diff --git a/daemon/libvirtd.c b/daemon/libvirtd.c index 66f1388619..caf51bf809 100644 --- a/daemon/libvirtd.c +++ b/daemon/libvirtd.c @@ -3083,6 +3083,10 @@ int main(int argc, char **argv) { exit(EXIT_FAILURE); } + /* Set error logging priority to debug, so client errors don't + * show up as errors in the daemon log */ + virErrorSetLogPriority(VIR_LOG_DEBUG); + while (1) { int optidx = 0; int c; diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 33e52e205d..ef33f86268 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -831,6 +831,7 @@ virAuditSend; # virterror_internal.h virDispatchError; virErrorMsg; +virErrorSetLogPriority; virRaiseErrorFull; virReportErrorHelper; virReportOOMErrorFull; diff --git a/src/util/virterror.c b/src/util/virterror.c index 83c4c9dcf0..6e49fa2f20 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 */ +static int virErrorLogPriority = -1; /* * Macro used to format the message as a string in virRaiseError @@ -64,6 +65,18 @@ void *virUserData = NULL; /* associated data */ }} \ } +static virLogPriority virErrorLevelPriority(virErrorLevel level) { + switch (level) { + case VIR_ERR_NONE: + return(VIR_LOG_INFO); + case VIR_ERR_WARNING: + return(VIR_LOG_WARN); + case VIR_ERR_ERROR: + return(VIR_LOG_ERROR); + } + return(VIR_LOG_ERROR); +} + static const char *virErrorDomainName(virErrorDomain domain) { const char *dom = "unknown"; switch (domain) { @@ -676,6 +689,7 @@ virRaiseErrorFull(virConnectPtr conn ATTRIBUTE_UNUSED, { virErrorPtr to; char *str; + int priority; /* * All errors are recorded in thread local storage @@ -703,8 +717,14 @@ 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 ? + * + * When an explicit error log priority is set then use it, otherwise + * translate the error level to the log priority. This is used by libvirtd + * to log client errors at debug priority. */ - virLogMessage(virErrorDomainName(domain), VIR_LOG_INFO, + priority = virErrorLogPriority == -1 ? virErrorLevelPriority(level) + : virErrorLogPriority; + virLogMessage(virErrorDomainName(domain), priority, funcname, linenr, 1, "%s", str); /* @@ -1319,3 +1339,9 @@ void virReportOOMErrorFull(int domcode, domcode, VIR_ERR_NO_MEMORY, VIR_ERR_ERROR, virerr, NULL, NULL, -1, -1, virerr, NULL); } + +void +virErrorSetLogPriority(int priority) +{ + virErrorLogPriority = priority; +} diff --git a/src/util/virterror_internal.h b/src/util/virterror_internal.h index 601a88472f..2dd2b4aff4 100644 --- a/src/util/virterror_internal.h +++ b/src/util/virterror_internal.h @@ -89,5 +89,6 @@ void virReportOOMErrorFull(int domcode, int virSetError(virErrorPtr newerr); void virDispatchError(virConnectPtr conn); const char *virStrerror(int theerrno, char *errBuf, size_t errBufLen); +void virErrorSetLogPriority(int priority); #endif