Currently, only one log file is created by the libxl driver, with all output from libxl for all domains going to this one file. Create a per-domain log file based on domain name, making sifting through the logs a bit easier. This required deferring libxl_ctx allocation until starting the domain, which is fine since the ctx is not used when the domain is inactive. --- src/libxl/libxl_conf.h | 5 +-- src/libxl/libxl_driver.c | 88 +++++++++++++++++++++++++++++------------------- 2 files changed, 57 insertions(+), 36 deletions(-) diff --git a/src/libxl/libxl_conf.h b/src/libxl/libxl_conf.h index aa57710..78133b9 100644 --- a/src/libxl/libxl_conf.h +++ b/src/libxl/libxl_conf.h @@ -57,8 +57,6 @@ struct _libxlDriverPrivate { virDomainXMLOptionPtr xmlopt; unsigned int version; - FILE *logger_file; - xentoollog_logger *logger; /* libxl ctx for driver wide ops; getVersion, getNodeInfo, ... */ libxl_ctx *ctx; @@ -93,6 +91,9 @@ typedef libxlDomainObjPrivate *libxlDomainObjPrivatePtr; struct _libxlDomainObjPrivate { virObjectLockable parent; + /* per domain log stream for libxl messages */ + FILE *logger_file; + xentoollog_logger *logger; /* per domain libxl ctx */ libxl_ctx *ctx; /* console */ diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index 9e9bc89..8e9a3d0 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -398,6 +398,51 @@ static const libxl_osevent_hooks libxl_event_callbacks = { .timeout_deregister = libxlTimeoutDeregisterEventHook, }; +static int +libxlDomainObjPrivateInitCtx(virDomainObjPtr vm) +{ + libxlDomainObjPrivatePtr priv = vm->privateData; + char *log_file; + int ret = -1; + + if (priv->ctx) + return 0; + + if (virAsprintf(&log_file, "%s/%s.log", LIBXL_LOG_DIR, vm->def->name) < 0) + return -1; + + if ((priv->logger_file = fopen(log_file, "a")) == NULL) { + virReportSystemError(errno, + _("failed to open logfile %s"), + log_file); + goto cleanup; + } + + priv->logger = + (xentoollog_logger *)xtl_createlogger_stdiostream(priv->logger_file, + XTL_DEBUG, 0); + if (!priv->logger) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("cannot create libxenlight logger for domain %s"), + vm->def->name); + goto cleanup; + } + + if (libxl_ctx_alloc(&priv->ctx, LIBXL_VERSION, 0, priv->logger)) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Failed libxl context initialization")); + goto cleanup; + } + + libxl_osevent_register_hooks(priv->ctx, &libxl_event_callbacks, priv); + + ret = 0; + +cleanup: + VIR_FREE(log_file); + return ret; +} + static void * libxlDomainObjPrivateAlloc(void) { @@ -409,14 +454,6 @@ libxlDomainObjPrivateAlloc(void) if (!(priv = virObjectLockableNew(libxlDomainObjPrivateClass))) return NULL; - if (libxl_ctx_alloc(&priv->ctx, LIBXL_VERSION, 0, libxl_driver->logger)) { - VIR_ERROR(_("Failed libxl context initialization")); - virObjectUnref(priv); - return NULL; - } - - libxl_osevent_register_hooks(priv->ctx, &libxl_event_callbacks, priv); - if (!(priv->devs = virChrdevAlloc())) return NULL; @@ -432,6 +469,11 @@ libxlDomainObjPrivateDispose(void *obj) libxl_evdisable_domain_death(priv->ctx, priv->deathW); virChrdevFree(priv->devs); + + xtl_logger_destroy(priv->logger); + if (priv->logger_file) + VIR_FORCE_FCLOSE(priv->logger_file); + libxl_ctx_free(priv->ctx); } @@ -929,6 +971,9 @@ libxlVmStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm, int managed_save_fd = -1; libxlDomainObjPrivatePtr priv = vm->privateData; + if (libxlDomainObjPrivateInitCtx(vm) < 0) + goto error; + /* If there is a managed saved state restore it instead of starting * from scratch. The old state is removed once the restoring succeeded. */ if (restore_fd < 0) { @@ -1135,9 +1180,6 @@ libxlStateCleanup(void) virObjectUnref(libxl_driver->xmlopt); virObjectUnref(libxl_driver->domains); libxl_ctx_free(libxl_driver->ctx); - xtl_logger_destroy(libxl_driver->logger); - if (libxl_driver->logger_file) - VIR_FORCE_FCLOSE(libxl_driver->logger_file); virObjectUnref(libxl_driver->reservedVNCPorts); @@ -1187,7 +1229,6 @@ libxlStateInitialize(bool privileged, void *opaque ATTRIBUTE_UNUSED) { const libxl_version_info *ver_info; - char *log_file = NULL; virCommandPtr cmd; int status, ret = 0; unsigned int free_mem; @@ -1267,17 +1308,6 @@ libxlStateInitialize(bool privileged, goto error; } - if (virAsprintf(&log_file, "%s/libxl.log", libxl_driver->logDir) < 0) - goto error; - - if ((libxl_driver->logger_file = fopen(log_file, "a")) == NULL) { - virReportSystemError(errno, - _("failed to create logfile %s"), - log_file); - goto error; - } - VIR_FREE(log_file); - /* read the host sysinfo */ if (privileged) libxl_driver->hostsysinfo = virSysinfoRead(); @@ -1286,16 +1316,7 @@ libxlStateInitialize(bool privileged, if (!libxl_driver->domainEventState) goto error; - libxl_driver->logger = - (xentoollog_logger *)xtl_createlogger_stdiostream(libxl_driver->logger_file, XTL_DEBUG, 0); - if (!libxl_driver->logger) { - VIR_INFO("cannot create logger for libxenlight, disabling driver"); - goto fail; - } - - if (libxl_ctx_alloc(&libxl_driver->ctx, - LIBXL_VERSION, 0, - libxl_driver->logger)) { + if (libxl_ctx_alloc(&libxl_driver->ctx, LIBXL_VERSION, 0, NULL)) { VIR_INFO("cannot initialize libxenlight context, probably not running in a Xen Dom0, disabling driver"); goto fail; } @@ -1362,7 +1383,6 @@ libxlStateInitialize(bool privileged, error: ret = -1; fail: - VIR_FREE(log_file); if (libxl_driver) libxlDriverUnlock(libxl_driver); libxlStateCleanup(); -- 1.8.1.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list