From 16c0e4a3c8de3c96d29fd495c1aded36d8935759 Mon Sep 17 00:00:00 2001 From: Mikhail Burakov Date: Sun, 25 Dec 2022 13:51:30 +0100 Subject: Use syslog for logging facilities --- utils.c | 27 +++++++++++++++++---------- utils.h | 18 +++++++++++++++--- 2 files changed, 32 insertions(+), 13 deletions(-) diff --git a/utils.c b/utils.c index b0f36fa..62f09fa 100644 --- a/utils.c +++ b/utils.c @@ -18,26 +18,33 @@ #include "utils.h" #include -#include -#include +#include #include #include static once_flag g_once_flag = ONCE_FLAG_INIT; -static mtx_t g_log_mutex; -static void InitLogMutex() { - if (mtx_init(&g_log_mutex, mtx_plain) != thrd_success) abort(); +static void InitLogging() { openlog(NULL, LOG_PERROR, LOG_USER); } + +static int LogLevelToPriority(enum LogLevel log_level) { + switch (log_level) { + case kLogLevelDebug: + return LOG_DEBUG; + case kLogLevelInfo: + return LOG_INFO; + case kLogLevelWarning: + return LOG_WARNING; + case kLogLevelError: + return LOG_ERR; + } } -void LogImpl(const char* fmt, ...) { - call_once(&g_once_flag, InitLogMutex); - int status = mtx_lock(&g_log_mutex); +void LogImpl(enum LogLevel log_level, const char* fmt, ...) { + call_once(&g_once_flag, InitLogging); va_list args; va_start(args, fmt); - vfprintf(stderr, fmt, args); + vsyslog(LogLevelToPriority(log_level), fmt, args); va_end(args); - if (status == thrd_success) mtx_unlock(&g_log_mutex); } unsigned long long MillisNow(void) { diff --git a/utils.h b/utils.h index 7eb585b..3774e62 100644 --- a/utils.h +++ b/utils.h @@ -24,11 +24,23 @@ extern "C" { #define STR_IMPL(op) #op #define STR(op) STR_IMPL(op) -#define LOG(fmt, ...) \ - LogImpl(__FILE__ ":" STR(__LINE__) " " fmt "\n", ##__VA_ARGS__) +#define LOG(log_level, fmt, ...) \ + LogImpl(level, __FILE__ ":" STR(__LINE__) " " fmt "\n", ##__VA_ARGS__) +#define LOGD(...) LOG(kLogLevelDebug, __VA_ARGS__) +#define LOGI(...) LOG(kLogLevelInfo, __VA_ARGS__) +#define LOGW(...) LOG(kLogLevelWarning, __VA_ARGS__) +#define LOGE(...) LOG(kLogLevelError, __VA_ARGS__) #define LENGTH(op) (sizeof(op) / sizeof *(op)) -void LogImpl(const char* fmt, ...) __attribute__((format(printf, 1, 2))); +enum LogLevel { + kLogLevelDebug = 0, + kLogLevelInfo, + kLogLevelWarning, + kLogLevelError, +}; + +void LogImpl(enum LogLevel log_level, const char* fmt, ...) + __attribute__((format(printf, 2, 3))); unsigned long long MillisNow(void); #ifdef __cplusplus -- cgit v1.2.3