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
---
daemon/libvirtd.c | 25 +++++++++++++++++++++++++
src/libvirt_private.syms | 1 +
src/util/virterror.c | 26 ++++++++++++++++++--------
src/util/virterror_internal.h | 3 +++
4 files changed, 47 insertions(+), 8 deletions(-)
diff --git a/daemon/libvirtd.c b/daemon/libvirtd.c
index e6d73cc..afc5c08 100644
--- a/daemon/libvirtd.c
+++ b/daemon/libvirtd.c
@@ -825,6 +825,30 @@ static void virshErrorHandler(void *opaque ATTRIBUTE_UNUSED,
virErrorPtr err ATT
* 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) {
struct qemud_server *server;
@@ -3258,6 +3282,7 @@ int main(int argc, char **argv) {
/* Disable error func, now logging is setup */
virSetErrorFunc(NULL, virshErrorHandler);
+ virSetErrorLogPriorityFunc(daemonErrorLogFilter);
/*
* Call the daemon startup hook
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 18fb3b2..cb0214e 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -922,6 +922,7 @@ virReportErrorHelper;
virReportOOMErrorFull;
virReportSystemErrorFull;
virSetError;
+virSetErrorLogPriorityFunc;
virStrerror;
diff --git a/src/util/virterror.c b/src/util/virterror.c
index 9130284..e45b582 100644
--- a/src/util/virterror.c
+++ b/src/util/virterror.c
@@ -26,6 +26,7 @@ virThreadLocal virLastErr;
virErrorFunc virErrorHandler = NULL; /* global error handler */
void *virUserData = NULL; /* associated data */
+virErrorLogPriorityFunc virErrorLogPriorityFilter = NULL;
/*
* Macro used to format the message as a string in virRaiseError
@@ -722,14 +723,6 @@ virRaiseErrorFull(virConnectPtr conn ATTRIBUTE_UNUSED,
}
/*
- * 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
*/
/*
@@ -749,6 +742,18 @@ virRaiseErrorFull(virConnectPtr conn ATTRIBUTE_UNUSED,
to->int1 = int1;
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;
}
@@ -1335,3 +1340,8 @@ void virReportOOMErrorFull(int domcode,
domcode, VIR_ERR_NO_MEMORY, VIR_ERR_ERROR,
virerr, NULL, NULL, -1, -1, virerr, NULL);
}
+
+void virSetErrorLogPriorityFunc(virErrorLogPriorityFunc func)
+{
+ virErrorLogPriorityFilter = func;
+}
diff --git a/src/util/virterror_internal.h b/src/util/virterror_internal.h
index 601a884..8f32f41 100644
--- a/src/util/virterror_internal.h
+++ b/src/util/virterror_internal.h
@@ -90,4 +90,7 @@ int virSetError(virErrorPtr newerr);
void virDispatchError(virConnectPtr conn);
const char *virStrerror(int theerrno, char *errBuf, size_t errBufLen);
+typedef int (*virErrorLogPriorityFunc)(virErrorPtr, int);
+void virSetErrorLogPriorityFunc(virErrorLogPriorityFunc func);
+
#endif
--
1.7.3.4