From 13592c5d2d6fdf74a5525f1f15d4e7477c73c986 Mon Sep 17 00:00:00 2001 From: Torsten Hilbrich Date: Wed, 21 Jun 2017 12:58:48 +0200 Subject: log: Introduce function pointer to handle different log backends This allows for easier additions of other logging mechanism. Using the syslog loglevel as parameter because we need to be able to map the MMLogLevel and the GLogLevelFlags to a common representation when using the log_backend in _mm_log and log_handler. The syslog level is more suitable because it supports more values than the MMLogLevel. --- src/mm-log.c | 55 ++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 36 insertions(+), 19 deletions(-) (limited to 'src/mm-log.c') diff --git a/src/mm-log.c b/src/mm-log.c index 151b40db..fcbef34d 100644 --- a/src/mm-log.c +++ b/src/mm-log.c @@ -49,6 +49,12 @@ static GTimeVal rel_start = { 0, 0 }; static int logfd = -1; static gboolean append_log_level_text = TRUE; +static void (*log_backend) (const char *loc, + const char *func, + int syslog_level, + const char *message, + size_t length); + typedef struct { guint32 num; const char *name; @@ -118,6 +124,30 @@ log_level_description (MMLogLevel level) return NULL; } +static void +log_backend_file (const char *loc, + const char *func, + int syslog_level, + const char *message, + size_t length) +{ + ssize_t ign; + ign = write (logfd, message, length); + if (ign) {} /* whatever; really shut up about unused result */ + + fsync (logfd); /* Make sure output is dumped to disk immediately */ +} + +static void +log_backend_syslog (const char *loc, + const char *func, + int syslog_level, + const char *message, + size_t length) +{ + syslog (syslog_level, "%s", message); +} + void _mm_log (const char *loc, const char *func, @@ -127,7 +157,6 @@ _mm_log (const char *loc, { va_list args; GTimeVal tv; - ssize_t ign; if (!(log_level & level)) return; @@ -169,14 +198,7 @@ _mm_log (const char *loc, g_string_append_c (msgbuf, '\n'); - if (logfd < 0) - syslog (mm_to_syslog_priority (level), "%s", msgbuf->str); - else { - ign = write (logfd, msgbuf->str, msgbuf->len); - if (ign) {} /* whatever; really shut up about unused result */ - - fsync (logfd); /* Make sure output is dumped to disk immediately */ - } + log_backend (loc, func, mm_to_syslog_priority (level), msgbuf->str, msgbuf->len); } static void @@ -185,14 +207,7 @@ log_handler (const gchar *log_domain, const gchar *message, gpointer ignored) { - ssize_t ign; - - if (logfd < 0) - syslog (glib_to_syslog_priority (level), "%s", message); - else { - ign = write (logfd, message, strlen (message)); - if (ign) {} /* whatever; really shut up about unused result */ - } + log_backend (NULL, NULL, glib_to_syslog_priority (level), message, strlen(message)); } gboolean @@ -243,9 +258,10 @@ mm_log_setup (const char *level, /* Grab start time for relative timestamps */ g_get_current_time (&rel_start); - if (log_file == NULL) + if (log_file == NULL) { openlog (G_LOG_DOMAIN, LOG_CONS | LOG_PID | LOG_PERROR, LOG_DAEMON); - else { + log_backend = log_backend_syslog; + } else { logfd = open (log_file, O_CREAT | O_APPEND | O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP); @@ -255,6 +271,7 @@ mm_log_setup (const char *level, errno, strerror (errno)); return FALSE; } + log_backend = log_backend_file; } g_log_set_handler (G_LOG_DOMAIN, -- cgit v1.2.3-70-g09d2