From: "Daniel P. Berrange" <berrange@xxxxxxxxxx> When reading log output from QEMU/LXC we need to skip over any libvirt log messages. Currently the QEMU driver checks for a fixed string, but this is better done with a regex. Add a method virLogProbablyLogMessage to do a regex check Signed-off-by: Daniel P. Berrange <berrange@xxxxxxxxxx> --- src/libvirt_private.syms | 1 + src/util/virlog.c | 37 +++++++++++++++++++++++++++++++++++++ src/util/virlog.h | 3 +++ 3 files changed, 41 insertions(+) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index ed46479..599b71e 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1429,6 +1429,7 @@ virLogMessage; virLogParseDefaultPriority; virLogParseFilters; virLogParseOutputs; +virLogProbablyLogMessage; virLogReset; virLogSetBufferSize; virLogSetDefaultPriority; diff --git a/src/util/virlog.c b/src/util/virlog.c index 24ec9d3..6a1adca 100644 --- a/src/util/virlog.c +++ b/src/util/virlog.c @@ -32,6 +32,7 @@ #include <unistd.h> #include <signal.h> #include <execinfo.h> +#include <regex.h> #if HAVE_SYSLOG_H # include <syslog.h> #endif @@ -75,6 +76,17 @@ static char *virLogBuffer = NULL; static int virLogLen = 0; static int virLogStart = 0; static int virLogEnd = 0; +static regex_t *virLogRegex = NULL; + + +#define VIR_LOG_DATE_REGEX "[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]" +#define VIR_LOG_TIME_REGEX "[0-9][0-9]:[0-9][0-9]:[0-9][0-9].[0-9][0-9][0-9]+[0-9][0-9][0-9][0-9]" +#define VIR_LOG_PID_REGEX "[0-9]+" +#define VIR_LOG_LEVEL_REGEX "debug|info|warning|error" + +#define VIR_LOG_REGEX \ + VIR_LOG_DATE_REGEX " " VIR_LOG_TIME_REGEX ": " \ + VIR_LOG_PID_REGEX ": " VIR_LOG_LEVEL_REGEX " : " /* * Filters are used to refine the rules on what to keep or drop @@ -209,6 +221,12 @@ virLogOnceInit(void) virLogStart = 0; virLogEnd = 0; virLogDefaultPriority = VIR_LOG_DEFAULT; + + if (VIR_ALLOC(virLogRegex) >= 0) { + if (regcomp(virLogRegex, VIR_LOG_REGEX, REG_EXTENDED) != 0) + VIR_FREE(virLogRegex); + } + virLogUnlock(); if (pbm) VIR_WARN("%s", pbm); @@ -1587,3 +1605,22 @@ virLogSetFromEnv(void) if (debugEnv && *debugEnv) virLogParseOutputs(debugEnv); } + + +/* + * Returns a true value if the first line in @str is + * probably a log message generated by the libvirt + * logging layer + */ +bool virLogProbablyLogMessage(const char *str) +{ + bool ret = false; + if (!virLogRegex) + return false; + virLogLock(); + if (regexec(virLogRegex, str, 0, NULL, 0) == 0) + ret = true; + virLogUnlock(); + VIR_ERROR("CHeck [%s]", str); + return ret; +} diff --git a/src/util/virlog.h b/src/util/virlog.h index aa81d6a..6b83245 100644 --- a/src/util/virlog.h +++ b/src/util/virlog.h @@ -188,4 +188,7 @@ extern void virLogVMessage(virLogSource src, va_list vargs) ATTRIBUTE_FMT_PRINTF(7, 0); extern int virLogSetBufferSize(int size); extern void virLogEmergencyDumpAll(int signum); + +bool virLogProbablyLogMessage(const char *str); + #endif -- 1.7.11.7 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list