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();