mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-22 12:35:17 +00:00
Filter out certain expected error messages from libvirtd
Add a hook to the error reporting APIs to allow specific error messages to be filtered out. Wire up libvirtd to remove VIR_ERR_NO_DOMAIN & similar error codes from the logs. They are still logged at DEBUG level. * daemon/libvirtd.c: Filter VIR_ERR_NO_DOMAIN and friends * src/libvirt_private.syms, src/util/virterror.c, src/util/virterror_internal.h: Hook for changing error reporting level
This commit is contained in:
parent
dbfca3ff70
commit
b8786c0641
@ -825,6 +825,30 @@ static void virshErrorHandler(void *opaque ATTRIBUTE_UNUSED, virErrorPtr err ATT
|
|||||||
* took care of reporting the error */
|
* took care of reporting the error */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int daemonErrorLogFilter(virErrorPtr err, int priority)
|
||||||
|
{
|
||||||
|
/* These error codes don't really reflect real errors. They
|
||||||
|
* are expected events that occur when an app tries to check
|
||||||
|
* whether a particular guest already exists. This filters
|
||||||
|
* them to a lower log level to prevent pollution of syslog
|
||||||
|
*/
|
||||||
|
switch (err->code) {
|
||||||
|
case VIR_ERR_NO_DOMAIN:
|
||||||
|
case VIR_ERR_NO_NETWORK:
|
||||||
|
case VIR_ERR_NO_STORAGE_POOL:
|
||||||
|
case VIR_ERR_NO_STORAGE_VOL:
|
||||||
|
case VIR_ERR_NO_NODE_DEVICE:
|
||||||
|
case VIR_ERR_NO_INTERFACE:
|
||||||
|
case VIR_ERR_NO_NWFILTER:
|
||||||
|
case VIR_ERR_NO_SECRET:
|
||||||
|
case VIR_ERR_NO_DOMAIN_SNAPSHOT:
|
||||||
|
return VIR_LOG_DEBUG;
|
||||||
|
}
|
||||||
|
|
||||||
|
return priority;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static struct qemud_server *qemudInitialize(void) {
|
static struct qemud_server *qemudInitialize(void) {
|
||||||
struct qemud_server *server;
|
struct qemud_server *server;
|
||||||
|
|
||||||
@ -3258,6 +3282,7 @@ int main(int argc, char **argv) {
|
|||||||
|
|
||||||
/* Disable error func, now logging is setup */
|
/* Disable error func, now logging is setup */
|
||||||
virSetErrorFunc(NULL, virshErrorHandler);
|
virSetErrorFunc(NULL, virshErrorHandler);
|
||||||
|
virSetErrorLogPriorityFunc(daemonErrorLogFilter);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Call the daemon startup hook
|
* Call the daemon startup hook
|
||||||
|
@ -923,6 +923,7 @@ virReportErrorHelper;
|
|||||||
virReportOOMErrorFull;
|
virReportOOMErrorFull;
|
||||||
virReportSystemErrorFull;
|
virReportSystemErrorFull;
|
||||||
virSetError;
|
virSetError;
|
||||||
|
virSetErrorLogPriorityFunc;
|
||||||
virStrerror;
|
virStrerror;
|
||||||
|
|
||||||
|
|
||||||
|
@ -26,6 +26,7 @@ virThreadLocal virLastErr;
|
|||||||
|
|
||||||
virErrorFunc virErrorHandler = NULL; /* global error handler */
|
virErrorFunc virErrorHandler = NULL; /* global error handler */
|
||||||
void *virUserData = NULL; /* associated data */
|
void *virUserData = NULL; /* associated data */
|
||||||
|
virErrorLogPriorityFunc virErrorLogPriorityFilter = NULL;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Macro used to format the message as a string in virRaiseError
|
* Macro used to format the message as a string in virRaiseError
|
||||||
@ -721,14 +722,6 @@ virRaiseErrorFull(virConnectPtr conn ATTRIBUTE_UNUSED,
|
|||||||
VIR_GET_VAR_STR(fmt, str);
|
VIR_GET_VAR_STR(fmt, str);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Hook up the error or warning to the logging facility
|
|
||||||
* XXXX should we include filename as 'category' instead of domain name ?
|
|
||||||
*/
|
|
||||||
priority = virErrorLevelPriority(level);
|
|
||||||
virLogMessage(virErrorDomainName(domain), priority,
|
|
||||||
funcname, linenr, 1, "%s", str);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Save the information about the error
|
* Save the information about the error
|
||||||
*/
|
*/
|
||||||
@ -749,6 +742,18 @@ virRaiseErrorFull(virConnectPtr conn ATTRIBUTE_UNUSED,
|
|||||||
to->int1 = int1;
|
to->int1 = int1;
|
||||||
to->int2 = int2;
|
to->int2 = int2;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Hook up the error or warning to the logging facility
|
||||||
|
* XXXX should we include filename as 'category' instead of domain name ?
|
||||||
|
*/
|
||||||
|
priority = virErrorLevelPriority(level);
|
||||||
|
if (virErrorLogPriorityFilter)
|
||||||
|
priority = virErrorLogPriorityFilter(to, priority);
|
||||||
|
virLogMessage(filename, priority,
|
||||||
|
funcname, linenr,
|
||||||
|
virErrorLogPriorityFilter ? 0 : 1,
|
||||||
|
"%s", str);
|
||||||
|
|
||||||
errno = save_errno;
|
errno = save_errno;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1335,3 +1340,8 @@ void virReportOOMErrorFull(int domcode,
|
|||||||
domcode, VIR_ERR_NO_MEMORY, VIR_ERR_ERROR,
|
domcode, VIR_ERR_NO_MEMORY, VIR_ERR_ERROR,
|
||||||
virerr, NULL, NULL, -1, -1, virerr, NULL);
|
virerr, NULL, NULL, -1, -1, virerr, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void virSetErrorLogPriorityFunc(virErrorLogPriorityFunc func)
|
||||||
|
{
|
||||||
|
virErrorLogPriorityFilter = func;
|
||||||
|
}
|
||||||
|
@ -90,4 +90,7 @@ int virSetError(virErrorPtr newerr);
|
|||||||
void virDispatchError(virConnectPtr conn);
|
void virDispatchError(virConnectPtr conn);
|
||||||
const char *virStrerror(int theerrno, char *errBuf, size_t errBufLen);
|
const char *virStrerror(int theerrno, char *errBuf, size_t errBufLen);
|
||||||
|
|
||||||
|
typedef int (*virErrorLogPriorityFunc)(virErrorPtr, int);
|
||||||
|
void virSetErrorLogPriorityFunc(virErrorLogPriorityFunc func);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user