diff options
Diffstat (limited to 'core/logger.c')
| -rw-r--r-- | core/logger.c | 105 |
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; |
