mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-05 04:25:19 +00:00
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 <eskultet@redhat.com>
This commit is contained in:
parent
0d6cf32721
commit
94c465d0eb
@ -675,103 +675,33 @@ daemonSetupLogging(struct daemonConfig *config,
|
|||||||
* Libvirtd's order of precedence is:
|
* Libvirtd's order of precedence is:
|
||||||
* cmdline > environment > config
|
* cmdline > environment > config
|
||||||
*
|
*
|
||||||
* In order to achieve this, we must process configuration in
|
* The default output is applied only if there was no setting from either
|
||||||
* different order for the log level versus the filters and
|
* the config or the environment. Because we don't have a way to determine
|
||||||
* outputs. Because filters and outputs append, we have to look at
|
* if the log level has been set, we must process variables in the opposite
|
||||||
* 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.
|
* order, each one overriding the previous.
|
||||||
*/
|
*/
|
||||||
if (config->log_level != 0)
|
if (config->log_level != 0)
|
||||||
virLogSetDefaultPriority(config->log_level);
|
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();
|
virLogSetFromEnv();
|
||||||
|
|
||||||
if (virLogGetNbFilters() == 0)
|
|
||||||
virLogSetFilters(config->log_filters);
|
|
||||||
|
|
||||||
if (virLogGetNbOutputs() == 0)
|
|
||||||
virLogSetOutputs(config->log_outputs);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Command line override for --verbose
|
* Command line override for --verbose
|
||||||
*/
|
*/
|
||||||
if ((verbose) && (virLogGetDefaultPriority() > VIR_LOG_INFO))
|
if ((verbose) && (virLogGetDefaultPriority() > VIR_LOG_INFO))
|
||||||
virLogSetDefaultPriority(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;
|
return 0;
|
||||||
|
|
||||||
error:
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -460,97 +460,33 @@ virLockDaemonSetupLogging(virLockDaemonConfigPtr config,
|
|||||||
* Libvirtd's order of precedence is:
|
* Libvirtd's order of precedence is:
|
||||||
* cmdline > environment > config
|
* cmdline > environment > config
|
||||||
*
|
*
|
||||||
* In order to achieve this, we must process configuration in
|
* The default output is applied only if there was no setting from either
|
||||||
* different order for the log level versus the filters and
|
* the config or the environment. Because we don't have a way to determine
|
||||||
* outputs. Because filters and outputs append, we have to look at
|
* if the log level has been set, we must process variables in the opposite
|
||||||
* 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.
|
* order, each one overriding the previous.
|
||||||
*/
|
*/
|
||||||
if (config->log_level != 0)
|
if (config->log_level != 0)
|
||||||
virLogSetDefaultPriority(config->log_level);
|
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();
|
virLogSetFromEnv();
|
||||||
|
|
||||||
if (virLogGetNbFilters() == 0)
|
|
||||||
virLogSetFilters(config->log_filters);
|
|
||||||
|
|
||||||
if (virLogGetNbOutputs() == 0)
|
|
||||||
virLogSetOutputs(config->log_outputs);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Command line override for --verbose
|
* Command line override for --verbose
|
||||||
*/
|
*/
|
||||||
if ((verbose) && (virLogGetDefaultPriority() > VIR_LOG_INFO))
|
if ((verbose) && (virLogGetDefaultPriority() > VIR_LOG_INFO))
|
||||||
virLogSetDefaultPriority(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;
|
return 0;
|
||||||
|
|
||||||
error:
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -385,100 +385,36 @@ virLogDaemonSetupLogging(virLogDaemonConfigPtr config,
|
|||||||
virLogReset();
|
virLogReset();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* virtlogd's order of precedence is:
|
* Libvirtd's order of precedence is:
|
||||||
* cmdline > environment > config
|
* cmdline > environment > config
|
||||||
*
|
*
|
||||||
* In order to achieve this, we must process configuration in
|
* The default output is applied only if there was no setting from either
|
||||||
* different order for the log level versus the filters and
|
* the config or the environment. Because we don't have a way to determine
|
||||||
* outputs. Because filters and outputs append, we have to look at
|
* if the log level has been set, we must process variables in the opposite
|
||||||
* 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.
|
* order, each one overriding the previous.
|
||||||
*/
|
*/
|
||||||
if (config->log_level != 0)
|
if (config->log_level != 0)
|
||||||
virLogSetDefaultPriority(config->log_level);
|
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();
|
virLogSetFromEnv();
|
||||||
|
|
||||||
if (virLogGetNbFilters() == 0)
|
|
||||||
virLogSetFilters(config->log_filters);
|
|
||||||
|
|
||||||
if (virLogGetNbOutputs() == 0)
|
|
||||||
virLogSetOutputs(config->log_outputs);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Command line override for --verbose
|
* Command line override for --verbose
|
||||||
*/
|
*/
|
||||||
if ((verbose) && (virLogGetDefaultPriority() > VIR_LOG_INFO))
|
if ((verbose) && (virLogGetDefaultPriority() > VIR_LOG_INFO))
|
||||||
virLogSetDefaultPriority(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;
|
return 0;
|
||||||
|
|
||||||
error:
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user