mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-23 06:05:27 +00:00
libxl: Create per-domain log file
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. Tested-by: Dario Faggioli <dario.faggioli@citrix.com>
This commit is contained in:
parent
38550ae809
commit
d72ef88876
@ -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 */
|
||||
|
@ -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();
|
||||
|
Loading…
Reference in New Issue
Block a user