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.
This commit is contained in:
Thomas Haller 2015-10-07 10:45:28 +02:00
parent cc6b07c439
commit fd87ce503c
3 changed files with 24 additions and 6 deletions

View File

@ -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">

View File

@ -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);

View File

@ -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;