[libvirt] [PATCH v2 03/10] daemon: Hook up the virLog{Get, Set}DefaultOutput to the daemon's init routine

Erik Skultety eskultet at redhat.com
Fri Nov 25 13:12:01 UTC 2016


Now that virLog{Get,Set}DefaultOutput routines are introduced we can wire them
up to the daemon's logging initialization code. Also, change the order of
operations a bit so that we still strictly honor our precedence of settings:
cmdline > env > config now that outputs and filters are not appended anymore.

Signed-off-by: Erik Skultety <eskultet at redhat.com>
---
 daemon/libvirtd.c         | 96 +++++++----------------------------------------
 src/locking/lock_daemon.c | 90 +++++++-------------------------------------
 src/logging/log_daemon.c  | 92 +++++++--------------------------------------
 3 files changed, 40 insertions(+), 238 deletions(-)

diff --git a/daemon/libvirtd.c b/daemon/libvirtd.c
index 3902a8b..b2e89fd 100644
--- a/daemon/libvirtd.c
+++ b/daemon/libvirtd.c
@@ -675,103 +675,33 @@ daemonSetupLogging(struct daemonConfig *config,
      * 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
+     * The default output is applied only if there was no setting from either
+     * the config or the environment. 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.
      */
     if (config->log_level != 0)
         virLogSetDefaultPriority(config->log_level);
 
+    if (virLogSetDefaultOutput("libvirtd.log", godaemon, privileged) < 0)
+        return -1;
+
+    /* In case the config is empty, the filters become empty and outputs will
+     * be set to default
+     */
+    virLogSetFilters(config->log_filters);
+    virLogSetOutputs(config->log_outputs);
+
+    /* If there are some environment variables defined, use those instead */
     virLogSetFromEnv();
 
-    if (virLogGetNbFilters() == 0)
-        virLogSetFilters(config->log_filters);
-
-    if (virLogGetNbOutputs() == 0)
-        virLogSetOutputs(config->log_outputs);
-
     /*
      * Command line override for --verbose
      */
     if ((verbose) && (virLogGetDefaultPriority() > VIR_LOG_INFO))
         virLogSetDefaultPriority(VIR_LOG_INFO);
 
-    /*
-     * If no defined outputs, and either running
-     * as daemon or not on a tty, then first try
-     * to direct it to the systemd journal
-     * (if it exists)....
-     */
-    if (virLogGetNbOutputs() == 0 &&
-        (godaemon || !isatty(STDIN_FILENO))) {
-        char *tmp;
-        if (access("/run/systemd/journal/socket", W_OK) >= 0) {
-            virLogPriority priority = virLogGetDefaultPriority();
-
-            /* By default we don't want to log too much stuff into journald as
-             * it may employ rate limiting and thus block libvirt execution. */
-            if (priority == VIR_LOG_DEBUG)
-                priority = VIR_LOG_INFO;
-
-            if (virAsprintf(&tmp, "%d:journald", priority) < 0)
-                goto error;
-            virLogSetOutputs(tmp);
-            VIR_FREE(tmp);
-        }
-    }
-
-    /*
-     * otherwise direct to libvirtd.log when running
-     * as daemon. Otherwise the default output is stderr.
-     */
-    if (virLogGetNbOutputs() == 0) {
-        char *tmp = NULL;
-
-        if (godaemon) {
-            if (privileged) {
-                if (virAsprintf(&tmp, "%d:file:%s/log/libvirt/libvirtd.log",
-                                virLogGetDefaultPriority(),
-                                LOCALSTATEDIR) == -1)
-                    goto error;
-            } else {
-                char *logdir = virGetUserCacheDirectory();
-                mode_t old_umask;
-
-                if (!logdir)
-                    goto error;
-
-                old_umask = umask(077);
-                if (virFileMakePath(logdir) < 0) {
-                    umask(old_umask);
-                    goto error;
-                }
-                umask(old_umask);
-
-                if (virAsprintf(&tmp, "%d:file:%s/libvirtd.log",
-                                virLogGetDefaultPriority(), logdir) == -1) {
-                    VIR_FREE(logdir);
-                    goto error;
-                }
-                VIR_FREE(logdir);
-            }
-        } else {
-            if (virAsprintf(&tmp, "%d:stderr", virLogGetDefaultPriority()) < 0)
-                goto error;
-        }
-        virLogSetOutputs(tmp);
-        VIR_FREE(tmp);
-    }
-
     return 0;
-
- error:
-    return -1;
 }
 
 
diff --git a/src/locking/lock_daemon.c b/src/locking/lock_daemon.c
index 9ee818e..881af11 100644
--- a/src/locking/lock_daemon.c
+++ b/src/locking/lock_daemon.c
@@ -460,97 +460,33 @@ virLockDaemonSetupLogging(virLockDaemonConfigPtr config,
      * 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
+     * The default output is applied only if there was no setting from either
+     * the config or the environment. 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.
      */
     if (config->log_level != 0)
         virLogSetDefaultPriority(config->log_level);
 
+    if (virLogSetDefaultOutput("virtlockd.log", godaemon, privileged) < 0)
+        return -1;
+
+    /* In case the config is empty, the filters become empty and outputs will
+     * be set to default
+     */
+    virLogSetFilters(config->log_filters);
+    virLogSetOutputs(config->log_outputs);
+
+    /* If there are some environment variables defined, use those instead */
     virLogSetFromEnv();
 
-    if (virLogGetNbFilters() == 0)
-        virLogSetFilters(config->log_filters);
-
-    if (virLogGetNbOutputs() == 0)
-        virLogSetOutputs(config->log_outputs);
-
     /*
      * Command line override for --verbose
      */
     if ((verbose) && (virLogGetDefaultPriority() > VIR_LOG_INFO))
         virLogSetDefaultPriority(VIR_LOG_INFO);
 
-    /*
-     * If no defined outputs, and either running
-     * as daemon or not on a tty, then first try
-     * to direct it to the systemd journal
-     * (if it exists)....
-     */
-    if (virLogGetNbOutputs() == 0 &&
-        (godaemon || !isatty(STDIN_FILENO))) {
-        char *tmp;
-        if (access("/run/systemd/journal/socket", W_OK) >= 0) {
-            if (virAsprintf(&tmp, "%d:journald", virLogGetDefaultPriority()) < 0)
-                goto error;
-            virLogSetOutputs(tmp);
-            VIR_FREE(tmp);
-        }
-    }
-
-    /*
-     * otherwise direct to libvirtd.log when running
-     * as daemon. Otherwise the default output is stderr.
-     */
-    if (virLogGetNbOutputs() == 0) {
-        char *tmp = NULL;
-
-        if (godaemon) {
-            if (privileged) {
-                if (virAsprintf(&tmp, "%d:file:%s/log/libvirt/virtlockd.log",
-                                virLogGetDefaultPriority(),
-                                LOCALSTATEDIR) == -1)
-                    goto error;
-            } else {
-                char *logdir = virGetUserCacheDirectory();
-                mode_t old_umask;
-
-                if (!logdir)
-                    goto error;
-
-                old_umask = umask(077);
-                if (virFileMakePath(logdir) < 0) {
-                    VIR_FREE(logdir);
-                    umask(old_umask);
-                    goto error;
-                }
-                umask(old_umask);
-
-                if (virAsprintf(&tmp, "%d:file:%s/virtlockd.log",
-                                virLogGetDefaultPriority(), logdir) == -1) {
-                    VIR_FREE(logdir);
-                    goto error;
-                }
-                VIR_FREE(logdir);
-            }
-        } else {
-            if (virAsprintf(&tmp, "%d:stderr", virLogGetDefaultPriority()) < 0)
-                goto error;
-        }
-        virLogSetOutputs(tmp);
-        VIR_FREE(tmp);
-    }
-
     return 0;
-
- error:
-    return -1;
 }
 
 
diff --git a/src/logging/log_daemon.c b/src/logging/log_daemon.c
index a9aebdb..793811e 100644
--- a/src/logging/log_daemon.c
+++ b/src/logging/log_daemon.c
@@ -385,100 +385,36 @@ virLogDaemonSetupLogging(virLogDaemonConfigPtr config,
     virLogReset();
 
     /*
-     * virtlogd's order of precedence is:
+     * 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
+     * The default output is applied only if there was no setting from either
+     * the config or the environment. 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.
      */
     if (config->log_level != 0)
         virLogSetDefaultPriority(config->log_level);
 
+    if (virLogSetDefaultOutput("virtlogd.log", godaemon, privileged) < 0)
+        return -1;
+
+    /* In case the config is empty, the filters become empty and outputs will
+     * be set to default
+     */
+    virLogSetFilters(config->log_filters);
+    virLogSetOutputs(config->log_outputs);
+
+    /* If there are some environment variables defined, use those instead */
     virLogSetFromEnv();
 
-    if (virLogGetNbFilters() == 0)
-        virLogSetFilters(config->log_filters);
-
-    if (virLogGetNbOutputs() == 0)
-        virLogSetOutputs(config->log_outputs);
-
     /*
      * Command line override for --verbose
      */
     if ((verbose) && (virLogGetDefaultPriority() > VIR_LOG_INFO))
         virLogSetDefaultPriority(VIR_LOG_INFO);
 
-    /*
-     * If no defined outputs, and either running
-     * as daemon or not on a tty, then first try
-     * to direct it to the systemd journal
-     * (if it exists)....
-     */
-    if (virLogGetNbOutputs() == 0 &&
-        (godaemon || !isatty(STDIN_FILENO))) {
-        char *tmp;
-        if (access("/run/systemd/journal/socket", W_OK) >= 0) {
-            if (virAsprintf(&tmp, "%d:journald", virLogGetDefaultPriority()) < 0)
-                goto error;
-            virLogSetOutputs(tmp);
-            VIR_FREE(tmp);
-        }
-    }
-
-    /*
-     * otherwise direct to libvirtd.log when running
-     * as daemon. Otherwise the default output is stderr.
-     */
-    if (virLogGetNbOutputs() == 0) {
-        char *tmp = NULL;
-
-        if (godaemon) {
-            if (privileged) {
-                if (virAsprintf(&tmp, "%d:file:%s/log/libvirt/virtlogd.log",
-                                virLogGetDefaultPriority(),
-                                LOCALSTATEDIR) == -1)
-                    goto error;
-            } else {
-                char *logdir = virGetUserCacheDirectory();
-                mode_t old_umask;
-
-                if (!logdir)
-                    goto error;
-
-                old_umask = umask(077);
-                if (virFileMakePath(logdir) < 0) {
-                    umask(old_umask);
-                    VIR_FREE(logdir);
-                    goto error;
-                }
-                umask(old_umask);
-
-                if (virAsprintf(&tmp, "%d:file:%s/virtlogd.log",
-                                virLogGetDefaultPriority(), logdir) == -1) {
-                    VIR_FREE(logdir);
-                    goto error;
-                }
-                VIR_FREE(logdir);
-            }
-        } else {
-            if (virAsprintf(&tmp, "%d:stderr", virLogGetDefaultPriority()) < 0)
-                goto error;
-        }
-        virLogSetOutputs(tmp);
-        VIR_FREE(tmp);
-    }
-
     return 0;
-
- error:
-    return -1;
 }
 
 
-- 
2.5.5




More information about the libvir-list mailing list