diff options
author | Thomas Haller <thaller@redhat.com> | 2016-02-13 16:27:11 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2016-02-21 18:37:49 +0100 |
commit | 1905862e261b5804617029deaafccf9a2cd97e35 (patch) | |
tree | af36d3c92d11fe6443d366f04b7b8319dd6a2b1c /src/nm-logging.c | |
parent | d22b3fabc5e928254436935072ce600bc1c7c983 (diff) | |
download | NetworkManager-1905862e261b5804617029deaafccf9a2cd97e35.tar.gz |
logging: add logging-format-flags
No functional change.
Diffstat (limited to 'src/nm-logging.c')
-rw-r--r-- | src/nm-logging.c | 111 |
1 files changed, 82 insertions, 29 deletions
diff --git a/src/nm-logging.c b/src/nm-logging.c index c9006eb7a1..967f5bd979 100644 --- a/src/nm-logging.c +++ b/src/nm-logging.c @@ -41,6 +41,35 @@ #include "NetworkManagerUtils.h" #include "nm-linux-platform.h" +typedef enum { + LOG_FORMAT_FLAG_NONE = 0, + LOG_FORMAT_FLAG_TIMESTAMP_DEBUG = (1LL << 0), + LOG_FORMAT_FLAG_TIMESTAMP_INFO = (1LL << 1), + LOG_FORMAT_FLAG_TIMESTAMP_ERROR = (1LL << 2), + LOG_FORMAT_FLAG_LOCATION_DEBUG = (1LL << 3), + LOG_FORMAT_FLAG_LOCATION_INFO = (1LL << 4), + LOG_FORMAT_FLAG_LOCATION_ERROR = (1LL << 5), + + _LOG_FORMAT_FLAG_TIMESTAMP = LOG_FORMAT_FLAG_TIMESTAMP_DEBUG | + LOG_FORMAT_FLAG_TIMESTAMP_INFO | + LOG_FORMAT_FLAG_TIMESTAMP_ERROR, + _LOG_FORMAT_FLAG_LOCATION = LOG_FORMAT_FLAG_LOCATION_DEBUG | + LOG_FORMAT_FLAG_LOCATION_INFO | + LOG_FORMAT_FLAG_LOCATION_ERROR, + + _LOG_FORMAT_FLAG_LEVEL_DEBUG = LOG_FORMAT_FLAG_TIMESTAMP_DEBUG | + LOG_FORMAT_FLAG_LOCATION_DEBUG, + _LOG_FORMAT_FLAG_LEVEL_INFO = LOG_FORMAT_FLAG_TIMESTAMP_INFO | + LOG_FORMAT_FLAG_LOCATION_INFO, + _LOG_FORMAT_FLAG_LEVEL_ERROR = LOG_FORMAT_FLAG_TIMESTAMP_ERROR | + LOG_FORMAT_FLAG_LOCATION_ERROR, + + _LOG_FORMAT_FLAG_SYSLOG = LOG_FORMAT_FLAG_TIMESTAMP_DEBUG | + LOG_FORMAT_FLAG_TIMESTAMP_ERROR | + LOG_FORMAT_FLAG_LOCATION_DEBUG | + LOG_FORMAT_FLAG_LOCATION_ERROR, +} LogFormatFlags; + static void nm_log_handler (const gchar *log_domain, GLogLevelFlags level, @@ -57,18 +86,18 @@ typedef struct { const char *level_str; int syslog_level; GLogLevelFlags g_log_level; - gboolean full_details; + LogFormatFlags log_format_level; } LogLevelDesc; static struct { NMLogLevel log_level; NMLogDomain logging[_LOGL_N_REAL]; gboolean logging_set_up; + LogFormatFlags log_format_flags; enum { LOG_BACKEND_GLIB, LOG_BACKEND_SYSLOG, LOG_BACKEND_JOURNAL, - LOG_BACKEND_JOURNAL_SYSLOG_STYLE, } log_backend; char *logging_domains_to_string; const LogLevelDesc level_desc[_LOGL_N]; @@ -81,13 +110,13 @@ static struct { .log_level = LOGL_INFO, .log_backend = LOG_BACKEND_GLIB, .level_desc = { - [LOGL_TRACE] = { "TRACE", "<trace>", LOG_DEBUG, G_LOG_LEVEL_DEBUG, TRUE }, - [LOGL_DEBUG] = { "DEBUG", "<debug>", LOG_INFO, G_LOG_LEVEL_DEBUG, TRUE }, - [LOGL_INFO] = { "INFO", "<info>", LOG_INFO, G_LOG_LEVEL_MESSAGE, FALSE }, - [LOGL_WARN] = { "WARN", "<warn>", LOG_WARNING, G_LOG_LEVEL_WARNING, FALSE }, - [LOGL_ERR] = { "ERR", "<error>", LOG_ERR, G_LOG_LEVEL_WARNING, TRUE }, - [_LOGL_OFF] = { "OFF", NULL, 0, 0, FALSE }, - [_LOGL_KEEP] = { "KEEP", NULL, 0, 0, FALSE }, + [LOGL_TRACE] = { "TRACE", "<trace>", LOG_DEBUG, G_LOG_LEVEL_DEBUG, _LOG_FORMAT_FLAG_LEVEL_DEBUG }, + [LOGL_DEBUG] = { "DEBUG", "<debug>", LOG_INFO, G_LOG_LEVEL_DEBUG, _LOG_FORMAT_FLAG_LEVEL_DEBUG }, + [LOGL_INFO] = { "INFO", "<info>", LOG_INFO, G_LOG_LEVEL_MESSAGE, _LOG_FORMAT_FLAG_LEVEL_INFO }, + [LOGL_WARN] = { "WARN", "<warn>", LOG_WARNING, G_LOG_LEVEL_WARNING, _LOG_FORMAT_FLAG_LEVEL_INFO }, + [LOGL_ERR] = { "ERR", "<error>", LOG_ERR, G_LOG_LEVEL_WARNING, _LOG_FORMAT_FLAG_LEVEL_ERROR }, + [_LOGL_OFF] = { "OFF", NULL, 0, 0, 0 }, + [_LOGL_KEEP] = { "KEEP", NULL, 0, 0, 0 }, }, .domain_desc = { { LOGD_PLATFORM, "PLATFORM" }, @@ -469,7 +498,9 @@ _nm_log_impl (const char *file, { va_list args; char *msg; - char *fullmsg = NULL; + char *fullmsg; + char s_buf_timestamp[64]; + char s_buf_location[1024]; GTimeVal tv; if ((guint) level >= G_N_ELEMENTS (global.logging)) @@ -491,10 +522,26 @@ _nm_log_impl (const char *file, msg = g_strdup_vprintf (fmt, args); va_end (args); + if (NM_FLAGS_ANY (global.log_format_flags, global.level_desc[level].log_format_level & _LOG_FORMAT_FLAG_TIMESTAMP)) { + g_get_current_time (&tv); + nm_sprintf_buf (s_buf_timestamp, " [%ld.%06ld]", tv.tv_sec, tv.tv_usec); + } else + s_buf_timestamp[0] = '\0'; + + s_buf_location[0] = '\0'; + if (NM_FLAGS_ANY (global.log_format_flags, global.level_desc[level].log_format_level & _LOG_FORMAT_FLAG_LOCATION)) { + gsize l = sizeof (s_buf_location); + char *p = s_buf_location; + + if (file) + nm_utils_strbuf_append (&p, &l, " [%s:%u]", file, line); + if (func) + nm_utils_strbuf_append (&p, &l, " %s():", func); + } + switch (global.log_backend) { #if SYSTEMD_JOURNAL case LOG_BACKEND_JOURNAL: - case LOG_BACKEND_JOURNAL_SYSLOG_STYLE: { gint64 now, boottime; #define _NUM_MAX_FIELDS_SYSLOG_FACILITY 10 @@ -507,12 +554,12 @@ _nm_log_impl (const char *file, boottime = nm_utils_monotonic_timestamp_as_boottime (now, 1); _iovec_set_format (iov, iov_free, i_field++, "PRIORITY=%d", global.level_desc[level].syslog_level); - if ( global.log_backend == LOG_BACKEND_JOURNAL_SYSLOG_STYLE - && global.level_desc[level].full_details) { - g_get_current_time (&tv); - _iovec_set_format (iov, iov_free, i_field++, "MESSAGE=%-7s [%ld.%06ld] [%s:%u] %s(): %s", global.level_desc[level].level_str, tv.tv_sec, tv.tv_usec, file, line, func, msg); - } else - _iovec_set_format (iov, iov_free, i_field++, "MESSAGE=%-7s %s", global.level_desc[level].level_str, msg); + _iovec_set_format (iov, iov_free, i_field++, "MESSAGE=" + "%-7s%s%s %s", + global.level_desc[level].level_str, + s_buf_timestamp, + s_buf_location, + msg); _iovec_set_literal_string (iov, iov_free, i_field++, "SYSLOG_IDENTIFIER=" G_LOG_DOMAIN); _iovec_set_format (iov, iov_free, i_field++, "SYSLOG_PID=%ld", (long) getpid ()); { @@ -558,8 +605,8 @@ _nm_log_impl (const char *file, _iovec_set_format (iov, iov_free, i_field++, "NM_LOG_DOMAINS=%s", s_domain_1); } _iovec_set_format (iov, iov_free, i_field++, "NM_LOG_LEVEL=%s", global.level_desc[level].name); - _iovec_set_format (iov, iov_free, i_field++, "CODE_FUNC=%s", func); - _iovec_set_format (iov, iov_free, i_field++, "CODE_FILE=%s", file); + _iovec_set_format (iov, iov_free, i_field++, "CODE_FUNC=%s", func ?: ""); + _iovec_set_format (iov, iov_free, i_field++, "CODE_FILE=%s", file ?: ""); _iovec_set_format (iov, iov_free, i_field++, "CODE_LINE=%u", line); _iovec_set_format (iov, iov_free, i_field++, "TIMESTAMP_MONOTONIC=%lld.%06lld", (long long) (now / NM_UTILS_NS_PER_SECOND), (long long) ((now % NM_UTILS_NS_PER_SECOND) / 1000)); _iovec_set_format (iov, iov_free, i_field++, "TIMESTAMP_BOOTTIME=%lld.%06lld", (long long) (boottime / NM_UTILS_NS_PER_SECOND), (long long) ((boottime % NM_UTILS_NS_PER_SECOND) / 1000)); @@ -579,21 +626,21 @@ _nm_log_impl (const char *file, break; #endif default: - if (global.level_desc[level].full_details) { - g_get_current_time (&tv); - fullmsg = g_strdup_printf ("%-7s [%ld.%06ld] [%s:%u] %s(): %s", global.level_desc[level].level_str, tv.tv_sec, tv.tv_usec, file, line, func, msg); - } else - fullmsg = g_strdup_printf ("%-7s %s", global.level_desc[level].level_str, msg); + fullmsg = g_strdup_printf ("%-7s%s%s %s", + global.level_desc[level].level_str, + s_buf_timestamp, + s_buf_location, + msg); if (global.log_backend == LOG_BACKEND_SYSLOG) syslog (global.level_desc[level].syslog_level, "%s", fullmsg); else g_log (G_LOG_DOMAIN, global.level_desc[level].g_log_level, "%s", fullmsg); + g_free (fullmsg); break; } g_free (msg); - g_free (fullmsg); } /************************************************************************/ @@ -631,7 +678,6 @@ nm_log_handler (const gchar *log_domain, switch (global.log_backend) { #if SYSTEMD_JOURNAL case LOG_BACKEND_JOURNAL: - case LOG_BACKEND_JOURNAL_SYSLOG_STYLE: { gint64 now, boottime; @@ -660,6 +706,8 @@ nm_log_handler (const gchar *log_domain, void nm_logging_syslog_openlog (const char *logging_backend) { + LogFormatFlags log_format_flags; + if (global.log_backend != LOG_BACKEND_GLIB) g_return_if_reached (); @@ -669,12 +717,14 @@ nm_logging_syslog_openlog (const char *logging_backend) if (strcmp (logging_backend, "debug") == 0) { global.log_backend = LOG_BACKEND_SYSLOG; openlog (G_LOG_DOMAIN, LOG_CONS | LOG_PERROR | LOG_PID, LOG_USER); + log_format_flags = _LOG_FORMAT_FLAG_SYSLOG; #if SYSTEMD_JOURNAL } else if (strcmp (logging_backend, "syslog") != 0) { - if (strcmp (logging_backend, "journal-syslog-style") != 0) - global.log_backend = LOG_BACKEND_JOURNAL; + if (strcmp (logging_backend, "journal-syslog-style") == 0) + log_format_flags = _LOG_FORMAT_FLAG_SYSLOG; else - global.log_backend = LOG_BACKEND_JOURNAL_SYSLOG_STYLE; + log_format_flags = LOG_FORMAT_FLAG_NONE; + global.log_backend = LOG_BACKEND_JOURNAL; /* ensure we read a monotonic timestamp. Reading the timestamp the first * time causes a logging message. We don't want to do that during _nm_log_impl. */ @@ -682,9 +732,12 @@ nm_logging_syslog_openlog (const char *logging_backend) #endif } else { global.log_backend = LOG_BACKEND_SYSLOG; + log_format_flags = _LOG_FORMAT_FLAG_SYSLOG; openlog (G_LOG_DOMAIN, LOG_PID, LOG_DAEMON); } + global.log_format_flags = log_format_flags; + g_log_set_handler (G_LOG_DOMAIN, G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION, nm_log_handler, |