summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikhail Burakov <mburakov@mailbox.org>2022-12-25 13:51:30 +0100
committerMikhail Burakov <mburakov@mailbox.org>2022-12-25 13:51:30 +0100
commit16c0e4a3c8de3c96d29fd495c1aded36d8935759 (patch)
tree688c88b1bf6ccd2a2b9957a07af767ff4925c4cf
parentd58fcf64d9e7a3f309a706ce6a81eb9a41eb5348 (diff)
Use syslog for logging facilities
-rw-r--r--utils.c27
-rw-r--r--utils.h18
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 <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
+#include <syslog.h>
#include <threads.h>
#include <time.h>
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