[libvirt] [PATCH 4/5] Consolidate code for parsing the logging environment variables

Amy Griffis amy.griffis at hp.com
Fri Jul 31 21:57:42 UTC 2009


Add two new functions to the internal API,
virLogParseDefaultPriority() and virLogSetFromEnv(),
as was suggested earlier by Cole Robinson.
---

 qemud/qemud.c            |   50 ++++++++++++++++++----------------------------
 src/libvirt.c            |   22 +-------------------
 src/libvirt_private.syms |    2 ++
 src/logging.c            |   50 ++++++++++++++++++++++++++++++++++++++++++++++
 src/logging.h            |    2 ++
 tests/eventtest.c        |   16 +++------------
 6 files changed, 78 insertions(+), 64 deletions(-)

diff --git a/qemud/qemud.c b/qemud/qemud.c
index 65c07d9..e6662e4 100644
--- a/qemud/qemud.c
+++ b/qemud/qemud.c
@@ -2488,7 +2488,6 @@ remoteReadSaslAllowedUsernameList (virConfPtr conf ATTRIBUTE_UNUSED,
  */
 static int
 qemudSetLogging(virConfPtr conf, const char *filename) {
-    char *debugEnv;
     int log_level;
     char *log_filters = NULL;
     char *log_outputs = NULL;
@@ -2497,9 +2496,18 @@ qemudSetLogging(virConfPtr conf, const char *filename) {
     virLogReset();
 
     /*
-     * look for default logging level first from config file,
-     * then from environment variable and finally from command
-     * line options
+     * Libvirtd's order of precedence is:
+     * cmdline > environment > config
+     *
+     * In order to achieve this, we must process configuration in
+     * different order for the log level versus the filters and
+     * outputs. Because filters and outputs append, we have to look at
+     * the environment first and then only check the config file if
+     * there was no result from the environment. The default output is
+     * then applied only if there was no setting from either of the
+     * first two. Because we don't have a way to determine if the log
+     * level has been set, we must process variables in the opposite
+     * order, each one overriding the previous.
      */
     /*
      * GET_CONF_INT returns 0 when there is no log_level setting in
@@ -2511,38 +2519,13 @@ qemudSetLogging(virConfPtr conf, const char *filename) {
     if (log_level != 0)
         virLogSetDefaultPriority(log_level);
 
-    debugEnv = getenv("LIBVIRT_DEBUG");
-    if (debugEnv && *debugEnv) {
-        if (STREQ(debugEnv, "1") || STREQ(debugEnv, "debug"))
-            virLogSetDefaultPriority(VIR_LOG_DEBUG);
-        else if (STREQ(debugEnv, "2") || STREQ(debugEnv, "info"))
-            virLogSetDefaultPriority(VIR_LOG_INFO);
-        else if (STREQ(debugEnv, "3") || STREQ(debugEnv, "warning"))
-            virLogSetDefaultPriority(VIR_LOG_WARN);
-        else if (STREQ(debugEnv, "4") || STREQ(debugEnv, "error"))
-            virLogSetDefaultPriority(VIR_LOG_ERROR);
-        else
-            VIR_WARN0(_("Ignoring invalid log level setting."));
-    }
-
-    if ((verbose) && (virLogGetDefaultPriority() > VIR_LOG_INFO))
-        virLogSetDefaultPriority(VIR_LOG_INFO);
-
-    debugEnv = getenv("LIBVIRT_LOG_FILTERS");
-    if (debugEnv && *debugEnv)
-        virLogParseFilters(strdup(debugEnv));
+    virLogSetFromEnv();
 
     if (virLogGetNbFilters() == 0) {
         GET_CONF_STR (conf, filename, log_filters);
         virLogParseFilters(log_filters);
     }
 
-    /* there is no default filters */
-
-    debugEnv = getenv("LIBVIRT_LOG_OUTPUTS");
-    if (debugEnv && *debugEnv)
-        virLogParseOutputs(strdup(debugEnv));
-
     if (virLogGetNbOutputs() == 0) {
         GET_CONF_STR (conf, filename, log_outputs);
         virLogParseOutputs(log_outputs);
@@ -2566,6 +2549,13 @@ qemudSetLogging(virConfPtr conf, const char *filename) {
         virLogParseOutputs(tmp);
         VIR_FREE(tmp);
     }
+
+    /*
+     * Command line override for --verbose
+     */
+    if ((verbose) && (virLogGetDefaultPriority() > VIR_LOG_INFO))
+        virLogSetDefaultPriority(VIR_LOG_INFO);
+
     ret = 0;
 
 free_and_fail:
diff --git a/src/libvirt.c b/src/libvirt.c
index 9e96410..19bffb1 100644
--- a/src/libvirt.c
+++ b/src/libvirt.c
@@ -262,7 +262,6 @@ winsock_init (void)
 int
 virInitialize(void)
 {
-    char *debugEnv;
     if (initialized)
         return(0);
 
@@ -273,26 +272,7 @@ virInitialize(void)
         virRandomInitialize(time(NULL) ^ getpid()))
         return -1;
 
-    debugEnv = getenv("LIBVIRT_DEBUG");
-    if (debugEnv && *debugEnv) {
-        if (STREQ(debugEnv, "1") || STREQ(debugEnv, "debug"))
-            virLogSetDefaultPriority(VIR_LOG_DEBUG);
-        else if (STREQ(debugEnv, "2") || STREQ(debugEnv, "info"))
-            virLogSetDefaultPriority(VIR_LOG_INFO);
-        else if (STREQ(debugEnv, "3") || STREQ(debugEnv, "warning"))
-            virLogSetDefaultPriority(VIR_LOG_WARN);
-        else if (STREQ(debugEnv, "4") || STREQ(debugEnv, "error"))
-            virLogSetDefaultPriority(VIR_LOG_ERROR);
-        else
-            VIR_WARN0(_("Ignoring invalid log level setting."));
-    }
-    debugEnv = getenv("LIBVIRT_LOG_FILTERS");
-    if (debugEnv && *debugEnv)
-        virLogParseFilters(debugEnv);
-
-    debugEnv = getenv("LIBVIRT_LOG_OUTPUTS");
-    if (debugEnv && *debugEnv)
-        virLogParseOutputs(debugEnv);
+    virLogSetFromEnv();
 
     DEBUG0("register drivers");
 
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 487585c..f20e5ce 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -217,8 +217,10 @@ virLogGetNbFilters;
 virLogGetNbOutputs;
 virLogGetDefaultPriority;
 virLogSetDefaultPriority;
+virLogSetFromEnv;
 virLogDefineFilter;
 virLogDefineOutput;
+virLogParseDefaultPriority;
 virLogParseFilters;
 virLogParseOutputs;
 virLogStartup;
diff --git a/src/logging.c b/src/logging.c
index aad4b50..b2cf0bf 100644
--- a/src/logging.c
+++ b/src/logging.c
@@ -829,3 +829,53 @@ int virLogGetNbFilters(void) {
 int virLogGetNbOutputs(void) {
     return (virLogNbOutputs);
 }
+
+/**
+ * virLogParseDefaultPriority:
+ * @priority: string defining the desired logging level
+ * 
+ * Parses and sets the default log priority level. It can take a string or
+ * number corresponding to the following levels:
+ *    1: DEBUG
+ *    2: INFO
+ *    3: WARNING
+ *    4: ERROR
+ *
+ * Returns the parsed log level or -1 on error.
+ */
+int virLogParseDefaultPriority(const char *priority) {
+    int ret = -1;
+
+    if (STREQ(priority, "1") || STREQ(priority, "debug"))
+        ret = virLogSetDefaultPriority(VIR_LOG_DEBUG);
+    else if (STREQ(priority, "2") || STREQ(priority, "info"))
+        ret = virLogSetDefaultPriority(VIR_LOG_INFO);
+    else if (STREQ(priority, "3") || STREQ(priority, "warning"))
+        ret = virLogSetDefaultPriority(VIR_LOG_WARN);
+    else if (STREQ(priority, "4") || STREQ(priority, "error"))
+        ret = virLogSetDefaultPriority(VIR_LOG_ERROR);
+    else
+        VIR_WARN0(_("Ignoring invalid log level setting"));
+
+    return ret;
+}
+
+/**
+ * virLogSetFromEnv:
+ *
+ * Sets virLogDefaultPriority, virLogFilters and virLogOutputs based on
+ * environment variables.
+ */
+void virLogSetFromEnv(void) {
+    char *debugEnv;
+
+    debugEnv = getenv("LIBVIRT_DEBUG");
+    if (debugEnv && *debugEnv)
+        virLogParseDefaultPriority(debugEnv);
+    debugEnv = getenv("LIBVIRT_LOG_FILTERS");
+    if (debugEnv && *debugEnv)
+        virLogParseFilters(strdup(debugEnv));
+    debugEnv = getenv("LIBVIRT_LOG_OUTPUTS");
+    if (debugEnv && *debugEnv)
+        virLogParseOutputs(strdup(debugEnv)); 
+}
diff --git a/src/logging.h b/src/logging.h
index c8698e5..8b2b84c 100644
--- a/src/logging.h
+++ b/src/logging.h
@@ -109,6 +109,7 @@ extern int virLogGetNbFilters(void);
 extern int virLogGetNbOutputs(void);
 extern int virLogGetDefaultPriority(void);
 extern int virLogSetDefaultPriority(int priority);
+extern void virLogSetFromEnv(void);
 extern int virLogDefineFilter(const char *match, int priority, int flags);
 extern int virLogDefineOutput(virLogOutputFunc f, virLogCloseFunc c,
                               void *data, int priority, int flags);
@@ -120,6 +121,7 @@ extern int virLogDefineOutput(virLogOutputFunc f, virLogCloseFunc c,
 extern int virLogStartup(void);
 extern int virLogReset(void);
 extern void virLogShutdown(void);
+extern int virLogParseDefaultPriority(const char *priority);
 extern int virLogParseFilters(const char *filters);
 extern int virLogParseOutputs(const char *output);
 extern void virLogMessage(const char *category, int priority,
diff --git a/tests/eventtest.c b/tests/eventtest.c
index 05fe3f3..d25381d 100644
--- a/tests/eventtest.c
+++ b/tests/eventtest.c
@@ -272,19 +272,9 @@ mymain(int argc, char **argv)
     if (virThreadInitialize() < 0)
         return EXIT_FAILURE;
     char *debugEnv = getenv("LIBVIRT_DEBUG");
-    if (debugEnv && *debugEnv) {
-        if (STREQ(debugEnv, "1") || STREQ(debugEnv, "debug"))
-            virLogSetDefaultPriority(VIR_LOG_DEBUG);
-        else if (STREQ(debugEnv, "2") || STREQ(debugEnv, "info"))
-            virLogSetDefaultPriority(VIR_LOG_INFO);
-        else if (STREQ(debugEnv, "3") || STREQ(debugEnv, "warning"))
-            virLogSetDefaultPriority(VIR_LOG_WARN);
-        else if (STREQ(debugEnv, "4") || STREQ(debugEnv, "error"))
-            virLogSetDefaultPriority(VIR_LOG_ERROR);
-        else {
-            fprintf(stderr, "Invalid log level setting.\n");
-            return EXIT_FAILURE;
-        }
+    if (debugEnv && *debugEnv && (virLogParseDefaultPriority(debugEnv) == -1)) {
+        fprintf(stderr, "Invalid log level setting.\n");
+        return EXIT_FAILURE;
     }
 
     virEventInit();




More information about the libvir-list mailing list