From fd87ce503c7927ba552b381b5c2d4b32fccb48dd Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 7 Oct 2015 10:45:28 +0200 Subject: [PATCH] logging: add special logging level "KEEP" Without this, the user cannot configure only certain logging domains without touching them all. E.g. # nmcli general logging level DEBUG domains PLATFORM will disable all non-PLATFORM domains. Well, the user can do: # nmcli general logging level INFO domains PLATFORM:DEBUG # nmcli general logging level DEBUG domains ALL:INFO,PLATFORM but in this case all non-PLATFORM domains are reset explicitly. Now the user can: # nmcli general logging level KEEP domains PLATFORM:DEBUG # nmcli general logging level DEBUG domains ALL:KEEP,PLATFORM which will only change the platform domain. --- introspection/nm-manager.xml | 8 +++++++- src/nm-logging.c | 21 ++++++++++++++++----- src/nm-logging.h | 1 + 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/introspection/nm-manager.xml b/introspection/nm-manager.xml index 88f477d62f..36cbee3011 100644 --- a/introspection/nm-manager.xml +++ b/introspection/nm-manager.xml @@ -184,7 +184,13 @@ - One of [ERR, WARN, INFO, DEBUG, TRACE]. + One of [ERR, WARN, INFO, DEBUG, TRACE, OFF, KEEP]. + This level is applied to the domains as specified in the domains + argument. Except for the special level "KEEP", all unmentioned + domains are disabled entirely. "KEEP" is special and allows + not to change the current setting except for the specified + domains. E.g. level=KEEP and domains=PLATFORM:DEBUG will only + touch the platform domain. diff --git a/src/nm-logging.c b/src/nm-logging.c index 30c754d163..e58a5de384 100644 --- a/src/nm-logging.c +++ b/src/nm-logging.c @@ -79,6 +79,7 @@ static const LogLevelDesc level_desc[_LOGL_N] = { [LOGL_WARN] = { "WARN", "", LOG_WARNING, G_LOG_LEVEL_WARNING, FALSE }, [LOGL_ERR] = { "ERR", "", LOG_ERR, G_LOG_LEVEL_WARNING, TRUE }, [_LOGL_OFF] = { "OFF", NULL, 0, 0, FALSE }, + [_LOGL_KEEP] = { "KEEP", NULL, 0, 0, FALSE }, }; static const LogDesc domain_descs[] = { @@ -181,6 +182,11 @@ nm_logging_setup (const char *level, if (level && *level) { if (!match_log_level (level, &new_log_level, error)) return FALSE; + if (new_log_level == _LOGL_KEEP) { + new_log_level = log_level; + for (i = 0; i < G_N_ELEMENTS (new_logging); i++) + new_logging[i] = logging[i]; + } } /* domains */ @@ -249,11 +255,16 @@ nm_logging_setup (const char *level, } } - for (i = 0; i < G_N_ELEMENTS (new_logging); i++) { - if (i < domain_log_level) - new_logging[i] &= ~bits; - else - new_logging[i] |= bits; + if (domain_log_level == _LOGL_KEEP) { + for (i = 0; i < G_N_ELEMENTS (new_logging); i++) + new_logging[i] = (new_logging[i] & ~bits) | (logging[i] & bits); + } else { + for (i = 0; i < G_N_ELEMENTS (new_logging); i++) { + if (i < domain_log_level) + new_logging[i] &= ~bits; + else + new_logging[i] |= bits; + } } } g_strfreev (tmp); diff --git a/src/nm-logging.h b/src/nm-logging.h index db9f0b1557..b54078186e 100644 --- a/src/nm-logging.h +++ b/src/nm-logging.h @@ -94,6 +94,7 @@ typedef enum { /*< skip >*/ _LOGL_N_REAL, /* the number of actual logging levels */ _LOGL_OFF = _LOGL_N_REAL, /* special logging level that is always disabled. */ + _LOGL_KEEP, /* special logging level to indicate that the logging level should not be changed. */ _LOGL_N, /* the number of logging levels including "OFF" */ } NMLogLevel;