diff options
author | Torsten Hilbrich <torsten.hilbrich@secunet.com> | 2017-06-21 12:58:48 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2017-06-21 13:06:23 +0200 |
commit | 13592c5d2d6fdf74a5525f1f15d4e7477c73c986 (patch) | |
tree | 3e97ea09f6df7dacf502a3ec5ac2076cd7859135 | |
parent | 7917c85c6bef78c3ec2973ad567f76f87e1eac4b (diff) |
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.
-rw-r--r-- | src/mm-log.c | 55 |
1 files changed, 36 insertions, 19 deletions
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, |