aboutsummaryrefslogtreecommitdiff
path: root/core/logger.c
diff options
context:
space:
mode:
Diffstat (limited to 'core/logger.c')
-rw-r--r--core/logger.c105
1 files changed, 105 insertions, 0 deletions
diff --git a/core/logger.c b/core/logger.c
new file mode 100644
index 0000000..af41dcc
--- /dev/null
+++ b/core/logger.c
@@ -0,0 +1,105 @@
+#include <assert.h>
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <time.h>
+#include <unistd.h>
+
+#define LOG_LINE_SIZE 1024
+
+enum LogLevel {
+ INFO,
+ WARN,
+};
+
+void log_msg_to_buff(char *out, int size, enum LogLevel level, bool colored, const char *format, va_list args) {
+ assert(out);
+ assert(size);
+ assert(level == INFO || level == WARN);
+ assert(format);
+
+ struct timespec ts;
+ clock_gettime(CLOCK_REALTIME, &ts);
+ long msec = ts.tv_nsec / 1000000;
+ struct tm tm = *localtime(&ts.tv_sec);
+ pid_t pid = getpid();
+ const char *level_str = NULL;
+
+ switch (level) {
+ case INFO:
+ level_str = "INFO";
+ break;
+ case WARN:
+ level_str = "WARN";
+ break;
+ default:
+ assert(false);
+ }
+
+ const char *color_code = NULL;
+ if (colored) {
+ switch (level) {
+ case INFO:
+ color_code = "\033[1;32m";
+ break;
+ case WARN:
+ color_code = "\033[1;33m";
+ break;
+ default:
+ assert(false);
+ }
+ }
+
+ // Imitate formatting style configured in 'salis.py'
+ int col = snprintf(
+ out,
+ size,
+ "%s%d-%02d-%02d %02d:%02d:%02d,%03ld %07d [%s]%s ",
+ colored ? color_code : "",
+ tm.tm_year + 1900,
+ tm.tm_mon + 1,
+ tm.tm_mday,
+ tm.tm_hour,
+ tm.tm_min,
+ tm.tm_sec,
+ msec,
+ pid,
+ level_str,
+ colored ? "\033[0m" : ""
+ );
+
+ vsnprintf(out + col, size - col, format, args);
+}
+
+void log_msg(enum LogLevel level, bool colored, const char *format, va_list args) {
+ assert(level == INFO || level == WARN);
+ assert(format);
+
+ char buff[LOG_LINE_SIZE];
+ log_msg_to_buff(buff, LOG_LINE_SIZE, level, colored, format, args);
+ printf("\r%s\n", buff);
+ fflush(stdout);
+}
+
+void log_info_default(const char *format, ...) {
+ assert(format);
+
+ va_list args;
+ va_start(args, format);
+ log_msg(INFO, true, format, args);
+ va_end(args);
+}
+
+void log_warn_default(const char *format, ...) {
+ assert(format);
+
+ va_list args;
+ va_start(args, format);
+ log_msg(WARN, true, format, args);
+ va_end(args);
+}
+
+// Client may install their own loggers
+void (*log_info)(const char *fmt, ...) = log_info_default;
+void (*log_warn)(const char *fmt, ...) = log_warn_default;