diff options
| author | Paul Oliver <contact@pauloliver.dev> | 2026-04-23 04:08:40 +0200 |
|---|---|---|
| committer | Paul Oliver <contact@pauloliver.dev> | 2026-04-23 04:08:40 +0200 |
| commit | 397286c87dc9aa3cba458973bdc65b3f3be14657 (patch) | |
| tree | 78d857c87182784fd9a86450973c7ebe7cac0e48 /core/logger.c | |
| parent | f0876156404da87782c4b0cf2b8086e0859e63c1 (diff) | |
Unifies logging between C and Python
Diffstat (limited to 'core/logger.c')
| -rw-r--r-- | core/logger.c | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/core/logger.c b/core/logger.c new file mode 100644 index 0000000..38ac8ed --- /dev/null +++ b/core/logger.c @@ -0,0 +1,84 @@ +#define LOG_LINE_SIZE 1024 + +enum LogLevel { + LOG_INFO, + LOG_WARN, + LOG_ERRO, +}; + +char g_log_buff[LOG_LINE_SIZE]; + +void log_msg_to_buff(char *out, int size, enum LogLevel level, const char *format, va_list args) { + assert(out); + assert(size); + assert(level == LOG_INFO || level == LOG_WARN || level == LOG_ERRO); + assert(format); + + struct timespec ts; + clock_gettime(CLOCK_REALTIME, &ts); + long msec = ts.tv_nsec / 1000000; + struct tm tm = *localtime(&ts.tv_sec); + int pid = getpid(); + + char *level_str = NULL; + switch (level) { + case LOG_INFO: level_str = "INFO"; break; + case LOG_WARN: level_str = "WARN"; break; + case LOG_ERRO: level_str = "ERRO"; break; + default: assert(false); + } + + int col = snprintf( + out, + size, + "%d-%02d-%02d %02d:%02d:%02d.%03ld %d [%s] ", + tm.tm_year + 1900, + tm.tm_mon + 1, + tm.tm_mday, + tm.tm_hour, + tm.tm_min, + tm.tm_sec, + msec, + pid, + level_str + ); + + vsnprintf(out + col, size - col, format, args); +} + +void log_msg(enum LogLevel level, const char *format, va_list args) { + assert(level == LOG_INFO || level == LOG_WARN || level == LOG_ERRO); + assert(format); + + log_msg_to_buff(g_log_buff, LOG_LINE_SIZE, level, format, args); + printf("\r%s\n", g_log_buff); +} + +void log_info(const char *format, ...) { + assert(format); + + va_list args; + va_start(args, format); + log_msg(LOG_INFO, format, args); + va_end(args); +} + +void log_warn(const char *format, ...) { + assert(format); + + va_list args; + va_start(args, format); + log_msg(LOG_WARN, format, args); + va_end(args); +} + +void log_erro(const char *format, ...) { + assert(format); + + va_list args; + va_start(args, format); + log_msg(LOG_ERRO, format, args); + va_end(args); + + exit(1); +} |
