logging: add special logging level "KEEP"
authorThomas Haller <thaller@redhat.com>
Wed, 7 Oct 2015 08:45:28 +0000 (10:45 +0200)
committerThomas Haller <thaller@redhat.com>
Fri, 9 Oct 2015 12:55:00 +0000 (14:55 +0200)
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
src/nm-logging.c
src/nm-logging.h

index 88f477d..36cbee3 100644 (file)
       </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">
index 30c754d..e58a5de 100644 (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);
index db9f0b1..b540781 100644 (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;