aboutsummaryrefslogtreecommitdiff
path: root/core/logger.c
diff options
context:
space:
mode:
authorPaul Oliver <contact@pauloliver.dev>2026-04-23 04:08:40 +0200
committerPaul Oliver <contact@pauloliver.dev>2026-04-23 04:08:40 +0200
commit397286c87dc9aa3cba458973bdc65b3f3be14657 (patch)
tree78d857c87182784fd9a86450973c7ebe7cac0e48 /core/logger.c
parentf0876156404da87782c4b0cf2b8086e0859e63c1 (diff)
Unifies logging between C and Python
Diffstat (limited to 'core/logger.c')
-rw-r--r--core/logger.c84
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);
+}