Depending on whether it's run as root or user, the log is saved
in the local state dir or in $HOME/.libvirt. The file descriptor
is kept as a global variable used by following patches.
* daemon/libvirtd.c: add libvirtd.log as the output for logs
Signed-off-by: Daniel Veillard <[email protected]>
---
daemon/libvirtd.c | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 85 insertions(+), 5 deletions(-)
diff --git a/daemon/libvirtd.c b/daemon/libvirtd.c
index b2e5e20..42e8585 100644
--- a/daemon/libvirtd.c
+++ b/daemon/libvirtd.c
@@ -197,6 +197,8 @@ static int audit_logging = 0;
#define DH_BITS 1024
+static int logFD = -1;
+
static sig_atomic_t sig_errors = 0;
static int sig_lasterrno = 0;
static const char *argv0;
@@ -2696,19 +2698,73 @@ remoteReadSaslAllowedUsernameList (virConfPtr conf ATTRIBUTE_UNUSED,
}
#endif
+static int
+qemudLogFileOutput(const char *category ATTRIBUTE_UNUSED,
+ int priority ATTRIBUTE_UNUSED,
+ const char *funcname ATTRIBUTE_UNUSED,
+ long long linenr ATTRIBUTE_UNUSED,
+ const char *str, int len,
+ void *data ATTRIBUTE_UNUSED) {
+ int ret;
+
+ if (logFD < 0)
+ return -1;
+ ret = safewrite(logFD, str, len);
+ return ret;
+}
+
/*
* Set up the logging environment
* By default if daemonized all errors go to syslog and the logging
- * is also saved onto the logfile libvird.log, but if verbose or error
+ * is also saved onto the logfile libvirtd.log, but if verbose or error
* debugging is asked for then output informations or debug.
*/
static int
-qemudSetLogging(virConfPtr conf, const char *filename)
+qemudSetLogging(struct qemud_server *server, virConfPtr conf,
+ const char *filename)
{
int log_level = 0;
char *log_filters = NULL;
char *log_outputs = NULL;
- int ret = -1;
+ char *log_file = NULL;
+ char *log_dir = NULL;
+ int ret = -1, rc;
+ int logmode = O_CREAT | O_WRONLY;
+
+ /*
+ * The log file can potentially grow a lot especially with full debug
+ * turned on.
+ * Only logrotate files in /var/log, so only append if running privileged
+ */
+ if (server->privileged) {
+ if (virAsprintf(&log_dir, "%s/log/libvirt", LOCALSTATEDIR) == -1)
+ goto out_of_memory;
+ if (virAsprintf(&log_file, "%s/log/libvirt/libvirtd.log",
+ LOCALSTATEDIR) == -1)
+ goto out_of_memory;
+ logmode |= O_APPEND;
+ } else {
+ uid_t uid = geteuid();
+ char *userdir = virGetUserDirectory(uid);
+ if (!userdir)
+ goto free_and_fail;
+
+ if (virAsprintf(&log_dir, "%s/.libvirt", userdir) == -1)
+ goto out_of_memory;
+ if (virAsprintf(&log_file, "%s/.libvirt/libvirtd.log", userdir) == -1)
+ goto out_of_memory;
+ logmode |= O_TRUNC;
+ }
+ if ((rc = virFileMakePath(log_dir)) != 0) {
+ virReportSystemError(rc, _("Failed to create log directory '%s'"),
+ log_dir);
+ goto free_and_fail;
+ }
+
+ if ((logFD = open(log_file, logmode, S_IRUSR | S_IWUSR)) < 0) {
+ virReportSystemError(errno, _("failed to create logfile %s"), log_file);
+ goto free_and_fail;
+ }
virLogReset();
@@ -2762,6 +2818,14 @@ qemudSetLogging(virConfPtr conf, const char *filename)
}
/*
+ * Also make sure default goes to libvirtd.log
+ */
+ if (virLogDefineOutput(qemudLogFileOutput, NULL, NULL, 0,
+ VIR_LOG_TO_FILE, "libvirtd.log", 0) <0)
+ goto free_and_fail;
+
+
+ /*
* Command line override for --verbose
*/
if ((verbose) && (virLogGetDefaultPriority() > VIR_LOG_INFO))
@@ -2772,7 +2836,23 @@ qemudSetLogging(virConfPtr conf, const char *filename)
free_and_fail:
VIR_FREE(log_filters);
VIR_FREE(log_outputs);
+ VIR_FREE(log_file);
+ VIR_FREE(log_dir);
return(ret);
+
+out_of_memory:
+ virReportOOMError();
+ goto free_and_fail;
+}
+
+/*
+ * Stop logging
+ */
+static void
+qemudStopLogging(void)
+{
+ virLogShutdown();
+ VIR_FORCE_CLOSE(logFD);
}
/* Read the config file if it exists.
@@ -2805,7 +2885,7 @@ remoteReadConfigFile (struct qemud_server *server, const char *filename)
/*
* First get all the logging settings and activate them
*/
- if (qemudSetLogging(conf, filename) < 0)
+ if (qemudSetLogging(server, conf, filename) < 0)
goto free_and_fail;
GET_CONF_INT (conf, filename, listen_tcp);
@@ -3369,6 +3449,6 @@ error:
qemudCleanup(server);
if (pid_file)
unlink (pid_file);
- virLogShutdown();
+ qemudStopLogging();
return ret;
}
--
libvir-list mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/libvir-list