Pau Espin Pedrol has uploaded this change for review. ( 
https://gerrit.osmocom.org/10116


Change subject: logging: Fix logging level all
......................................................................

logging: Fix logging level all

This commit fixes "logging level all <loglevel>" to have a behavior
which makes sense.

First, old "everything" deprecated loglevel is dropped and re-used as
"unset", which can be used to set loglevel for a given category to
whatever the logtarget defaults to.

When using "logging level all", VTY sets default log level to <loglevel>
and resets all log categories to UNSET. Then user can specify specific
log levels for specific categories using "logging level <cat>
<loglevel>".

For instance:
log stderr
 logging level all error
 logging level l1p notice

Will print ERROR messages for all categories and NOTICE+ERROR messages
for L1P category.

Another example: In the VTY, while debugging:
* logging level all error  -> Only all ERRORs are printed
* logging level l1p debug -> all INFO+NOTICE+ERROR for L1P, and all ERROR are 
printed.
Now, user is interested to debug some other category, eg. TRX:
* logging level l1p unset -> L1P goes back to target default (ERROR)
* logging level trx debug -> we get all TRX logs.

Fixes: OS#3409
Change-Id: I0f50ad8d6fd038398f7d751287417505c8dcdeff
---
M include/osmocom/core/logging.h
M src/logging.c
M src/vty/logging_vty.c
3 files changed, 27 insertions(+), 21 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/16/10116/1

diff --git a/include/osmocom/core/logging.h b/include/osmocom/core/logging.h
index e68f618..5d4fd36 100644
--- a/include/osmocom/core/logging.h
+++ b/include/osmocom/core/logging.h
@@ -97,6 +97,7 @@
        } while(0)

 /*! different log levels */
+#define LOGL_UNSET     0       /*!< Log level unset. Internal, don't use. */
 #define LOGL_DEBUG     1       /*!< debugging information */
 #define LOGL_INFO      3       /*!< general information */
 #define LOGL_NOTICE    5       /*!< abnormal/unexpected condition */
diff --git a/src/logging.c b/src/logging.c
index 1dfd484..7631ad1 100644
--- a/src/logging.c
+++ b/src/logging.c
@@ -67,7 +67,7 @@
 #define LOGLEVEL_DEFS  6       /* Number of loglevels.*/

 static const struct value_string loglevel_strs[LOGLEVEL_DEFS+1] = {
-       { 0,            "EVERYTHING" },
+       { 0,            "UNSET" },
        { LOGL_DEBUG,   "DEBUG" },
        { LOGL_INFO,    "INFO" },
        { LOGL_NOTICE,  "NOTICE" },
@@ -178,7 +178,7 @@
 /*! descriptive string for each log level */
 /* You have to keep this in sync with the structure loglevel_strs. */
 static const char *loglevel_descriptions[LOGLEVEL_DEFS+1] = {
-       "Don't use. It doesn't log anything",
+       "Unsets previous logging level for that category",
        "Log debug messages and higher levels",
        "Log informational messages and higher levels",
        "Log noticeable messages and higher levels",
@@ -474,13 +474,13 @@
        if (!category->enabled)
                return false;

-       /* Check the global log level */
-       if (tar->loglevel != 0 && level < tar->loglevel)
+       /* Check the category log level */
+       if (category->loglevel != LOGL_UNSET && level < category->loglevel)
                return false;

-       /* Check the category log level */
-       if (tar->loglevel == 0 && category->loglevel != 0 &&
-           level < category->loglevel)
+       /* Check the global log level */
+       if (category->loglevel == LOGL_UNSET && tar->loglevel != LOGL_UNSET &&
+           level < tar->loglevel)
                return false;

        /* Apply filters here... if that becomes messy we will
@@ -714,7 +714,19 @@
  */
 void log_set_log_level(struct log_target *target, int log_level)
 {
+       int i;
+
        target->loglevel = log_level;
+
+       for (i = 0; i < osmo_log_info->num_cat; i++) {
+               struct log_category *cat = &target->categories[i];
+
+               /* skip empty entries in the array */
+               if (!osmo_log_info->cat[i].name)
+                       continue;
+
+               cat->loglevel = LOGL_UNSET;
+       }
 }

 /*! Set a category filter on a given log target
@@ -783,7 +795,7 @@
        target->print_category_hex = true;

        /* global log level */
-       target->loglevel = 0;
+       target->loglevel = LOGL_UNSET;
        return target;
 }

diff --git a/src/vty/logging_vty.c b/src/vty/logging_vty.c
index 8151fda..80df73a 100644
--- a/src/vty/logging_vty.c
+++ b/src/vty/logging_vty.c
@@ -279,11 +279,6 @@
                return CMD_WARNING;
        }

-       if (strcmp(argv[1], "everything") == 0) { /* FIXME: remove this check 
once 'everything' is phased out */
-               vty_out(vty, "%% Ignoring deprecated logging level %s%s", 
argv[1], VTY_NEWLINE);
-               return CMD_SUCCESS;
-       }
-
        /* Check for special case where we want to set global log level */
        if (!strcmp(argv[0], "all")) {
                log_set_log_level(tgt, level);
@@ -811,18 +806,16 @@
                if (!osmo_log_info->cat[i].name)
                        continue;

+               /* skip unset categories */
+               if (cat->loglevel == LOGL_UNSET)
+                       continue;
+
                /* stupid old osmo logging API uses uppercase strings... */
                osmo_str2lower(cat_lower, osmo_log_info->cat[i].name+1);
                osmo_str2lower(level_lower, log_level_str(cat->loglevel));
-
-               if (strcmp(level_lower, "everything") != 0) /* FIXME: remove 
this check once 'everything' is phased out */
-                       vty_out(vty, "  logging level %s %s%s", cat_lower, 
level_lower, VTY_NEWLINE);
-               else
-                       LOGP(DLSTATS, LOGL_ERROR, "logging level everything is 
deprecated and should not be used\n");
+               vty_out(vty, "  logging level %s %s%s", cat_lower, level_lower, 
VTY_NEWLINE);
        }

-       /* FIXME: levels */
-
        return 1;
 }

@@ -846,7 +839,7 @@
 {
        struct cmd_element *cmd = talloc_zero(ctx, struct cmd_element);
        OSMO_ASSERT(cmd);
-       cmd->string = talloc_asprintf(cmd, "logging level %s 
(everything|debug|info|notice|error|fatal)",
+       cmd->string = talloc_asprintf(cmd, "logging level %s 
(unset|debug|info|notice|error|fatal)",
                                    name);
        printf("%s\n", cmd->string);
        cmd->func = log_deprecated_func;

--
To view, visit https://gerrit.osmocom.org/10116
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: I0f50ad8d6fd038398f7d751287417505c8dcdeff
Gerrit-Change-Number: 10116
Gerrit-PatchSet: 1
Gerrit-Owner: Pau Espin Pedrol <[email protected]>

Reply via email to