<p>Pau Espin Pedrol has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/10116">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">logging: Fix logging level all<br><br>This commit fixes "logging level all <loglevel>" to have a behavior<br>which makes sense.<br><br>First, old "everything" deprecated loglevel is dropped and re-used as<br>"unset", which can be used to set loglevel for a given category to<br>whatever the logtarget defaults to.<br><br>When using "logging level all", VTY sets default log level to <loglevel><br>and resets all log categories to UNSET. Then user can specify specific<br>log levels for specific categories using "logging level <cat><br><loglevel>".<br><br>For instance:<br>log stderr<br> logging level all error<br> logging level l1p notice<br><br>Will print ERROR messages for all categories and NOTICE+ERROR messages<br>for L1P category.<br><br>Another example: In the VTY, while debugging:<br>* logging level all error  -> Only all ERRORs are printed<br>* logging level l1p debug -> all INFO+NOTICE+ERROR for L1P, and all ERROR are printed.<br>Now, user is interested to debug some other category, eg. TRX:<br>* logging level l1p unset -> L1P goes back to target default (ERROR)<br>* logging level trx debug -> we get all TRX logs.<br><br>Fixes: OS#3409<br>Change-Id: I0f50ad8d6fd038398f7d751287417505c8dcdeff<br>---<br>M include/osmocom/core/logging.h<br>M src/logging.c<br>M src/vty/logging_vty.c<br>3 files changed, 27 insertions(+), 21 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/16/10116/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/core/logging.h b/include/osmocom/core/logging.h</span><br><span>index e68f618..5d4fd36 100644</span><br><span>--- a/include/osmocom/core/logging.h</span><br><span>+++ b/include/osmocom/core/logging.h</span><br><span>@@ -97,6 +97,7 @@</span><br><span>       } while(0)</span><br><span> </span><br><span> /*! different log levels */</span><br><span style="color: hsl(120, 100%, 40%);">+#define LOGL_UNSET       0       /*!< Log level unset. Internal, don't use. */</span><br><span> #define LOGL_DEBUG      1       /*!< debugging information */</span><br><span> #define LOGL_INFO   3       /*!< general information */</span><br><span> #define LOGL_NOTICE   5       /*!< abnormal/unexpected condition */</span><br><span>diff --git a/src/logging.c b/src/logging.c</span><br><span>index 1dfd484..7631ad1 100644</span><br><span>--- a/src/logging.c</span><br><span>+++ b/src/logging.c</span><br><span>@@ -67,7 +67,7 @@</span><br><span> #define LOGLEVEL_DEFS  6       /* Number of loglevels.*/</span><br><span> </span><br><span> static const struct value_string loglevel_strs[LOGLEVEL_DEFS+1] = {</span><br><span style="color: hsl(0, 100%, 40%);">-    { 0,            "EVERYTHING" },</span><br><span style="color: hsl(120, 100%, 40%);">+     { 0,            "UNSET" },</span><br><span>         { LOGL_DEBUG,   "DEBUG" },</span><br><span>         { LOGL_INFO,    "INFO" },</span><br><span>  { LOGL_NOTICE,  "NOTICE" },</span><br><span>@@ -178,7 +178,7 @@</span><br><span> /*! descriptive string for each log level */</span><br><span> /* You have to keep this in sync with the structure loglevel_strs. */</span><br><span> static const char *loglevel_descriptions[LOGLEVEL_DEFS+1] = {</span><br><span style="color: hsl(0, 100%, 40%);">-   "Don't use. It doesn't log anything",</span><br><span style="color: hsl(120, 100%, 40%);">+       "Unsets previous logging level for that category",</span><br><span>         "Log debug messages and higher levels",</span><br><span>    "Log informational messages and higher levels",</span><br><span>    "Log noticeable messages and higher levels",</span><br><span>@@ -474,13 +474,13 @@</span><br><span>       if (!category->enabled)</span><br><span>           return false;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       /* Check the global log level */</span><br><span style="color: hsl(0, 100%, 40%);">-        if (tar->loglevel != 0 && level < tar->loglevel)</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Check the category log level */</span><br><span style="color: hsl(120, 100%, 40%);">+    if (category->loglevel != LOGL_UNSET && level < category->loglevel)</span><br><span>                 return false;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       /* Check the category log level */</span><br><span style="color: hsl(0, 100%, 40%);">-      if (tar->loglevel == 0 && category->loglevel != 0 &&</span><br><span style="color: hsl(0, 100%, 40%);">-          level < category->loglevel)</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Check the global log level */</span><br><span style="color: hsl(120, 100%, 40%);">+      if (category->loglevel == LOGL_UNSET && tar->loglevel != LOGL_UNSET &&</span><br><span style="color: hsl(120, 100%, 40%);">+      level < tar->loglevel)</span><br><span>             return false;</span><br><span> </span><br><span>    /* Apply filters here... if that becomes messy we will</span><br><span>@@ -714,7 +714,19 @@</span><br><span>  */</span><br><span> void log_set_log_level(struct log_target *target, int log_level)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+ int i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     target->loglevel = log_level;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    for (i = 0; i < osmo_log_info->num_cat; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+          struct log_category *cat = &target->categories[i];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           /* skip empty entries in the array */</span><br><span style="color: hsl(120, 100%, 40%);">+         if (!osmo_log_info->cat[i].name)</span><br><span style="color: hsl(120, 100%, 40%);">+                   continue;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           cat->loglevel = LOGL_UNSET;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span> }</span><br><span> </span><br><span> /*! Set a category filter on a given log target</span><br><span>@@ -783,7 +795,7 @@</span><br><span>  target->print_category_hex = true;</span><br><span> </span><br><span>    /* global log level */</span><br><span style="color: hsl(0, 100%, 40%);">-  target->loglevel = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      target->loglevel = LOGL_UNSET;</span><br><span>    return target;</span><br><span> }</span><br><span> </span><br><span>diff --git a/src/vty/logging_vty.c b/src/vty/logging_vty.c</span><br><span>index 8151fda..80df73a 100644</span><br><span>--- a/src/vty/logging_vty.c</span><br><span>+++ b/src/vty/logging_vty.c</span><br><span>@@ -279,11 +279,6 @@</span><br><span>              return CMD_WARNING;</span><br><span>  }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (strcmp(argv[1], "everything") == 0) { /* FIXME: remove this check once 'everything' is phased out */</span><br><span style="color: hsl(0, 100%, 40%);">-              vty_out(vty, "%% Ignoring deprecated logging level %s%s", argv[1], VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-              return CMD_SUCCESS;</span><br><span style="color: hsl(0, 100%, 40%);">-     }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>    /* Check for special case where we want to set global log level */</span><br><span>   if (!strcmp(argv[0], "all")) {</span><br><span>             log_set_log_level(tgt, level);</span><br><span>@@ -811,18 +806,16 @@</span><br><span>               if (!osmo_log_info->cat[i].name)</span><br><span>                  continue;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+         /* skip unset categories */</span><br><span style="color: hsl(120, 100%, 40%);">+           if (cat->loglevel == LOGL_UNSET)</span><br><span style="color: hsl(120, 100%, 40%);">+                   continue;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>          /* stupid old osmo logging API uses uppercase strings... */</span><br><span>          osmo_str2lower(cat_lower, osmo_log_info->cat[i].name+1);</span><br><span>          osmo_str2lower(level_lower, log_level_str(cat->loglevel));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-           if (strcmp(level_lower, "everything") != 0) /* FIXME: remove this check once 'everything' is phased out */</span><br><span style="color: hsl(0, 100%, 40%);">-                    vty_out(vty, "  logging level %s %s%s", cat_lower, level_lower, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-         else</span><br><span style="color: hsl(0, 100%, 40%);">-                    LOGP(DLSTATS, LOGL_ERROR, "logging level everything is deprecated and should not be used\n");</span><br><span style="color: hsl(120, 100%, 40%);">+               vty_out(vty, "  logging level %s %s%s", cat_lower, level_lower, VTY_NEWLINE);</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   /* FIXME: levels */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>  return 1;</span><br><span> }</span><br><span> </span><br><span>@@ -846,7 +839,7 @@</span><br><span> {</span><br><span>        struct cmd_element *cmd = talloc_zero(ctx, struct cmd_element);</span><br><span>      OSMO_ASSERT(cmd);</span><br><span style="color: hsl(0, 100%, 40%);">-       cmd->string = talloc_asprintf(cmd, "logging level %s (everything|debug|info|notice|error|fatal)",</span><br><span style="color: hsl(120, 100%, 40%);">+        cmd->string = talloc_asprintf(cmd, "logging level %s (unset|debug|info|notice|error|fatal)",</span><br><span>                                name);</span><br><span>   printf("%s\n", cmd->string);</span><br><span>    cmd->func = log_deprecated_func;</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/10116">change 10116</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/10116"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmocore </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I0f50ad8d6fd038398f7d751287417505c8dcdeff </div>
<div style="display:none"> Gerrit-Change-Number: 10116 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Pau Espin Pedrol <pespin@sysmocom.de> </div>