summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2015-10-07 10:45:28 +0200
committerThomas Haller <thaller@redhat.com>2015-10-09 14:55:00 +0200
commitfd87ce503c7927ba552b381b5c2d4b32fccb48dd (patch)
treee2a3390bf6034b5c01d26c84a8c42b7334a5205e
parentcc6b07c43974bc83b2bc17dce5bbe5934149fb58 (diff)
downloadNetworkManager-fd87ce503c7927ba552b381b5c2d4b32fccb48dd.tar.gz
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.
-rw-r--r--introspection/nm-manager.xml8
-rw-r--r--src/nm-logging.c21
-rw-r--r--src/nm-logging.h1
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 @@
</tp:docstring>
<arg name="level" type="s" direction="in">
<tp:docstring>
- 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.
</tp:docstring>
</arg>
<arg name="domains" type="s" direction="in">
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", "<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 },
};
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;