From 94c465d0eb5cc3c0f6908a6b11fad83887ec0216 Mon Sep 17 00:00:00 2001 From: Erik Skultety Date: Mon, 31 Oct 2016 12:52:51 +0100 Subject: [PATCH] daemon: Hook up the virLog{Get,Set}DefaultOutput to the daemon's init routine 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 --- 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 3902a8bd18..b6d76ed84b 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 + */ + ignore_value(virLogSetFilters(config->log_filters)); + ignore_value(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 9ee818e93e..1c94ddd054 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 + */ + ignore_value(virLogSetFilters(config->log_filters)); + ignore_value(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 a9aebdb6d7..5997cce9d3 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 + */ + ignore_value(virLogSetFilters(config->log_filters)); + ignore_value(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; }