Add method for checking if a string is (probably) a log message

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@redhat.com>
This commit is contained in:
Daniel P. Berrange 2013-03-04 20:46:32 +00:00
parent 58e0accd8a
commit f3d312f6c8
3 changed files with 38 additions and 0 deletions

View File

@ -1429,6 +1429,7 @@ virLogMessage;
virLogParseDefaultPriority; virLogParseDefaultPriority;
virLogParseFilters; virLogParseFilters;
virLogParseOutputs; virLogParseOutputs;
virLogProbablyLogMessage;
virLogReset; virLogReset;
virLogSetBufferSize; virLogSetBufferSize;
virLogSetDefaultPriority; virLogSetDefaultPriority;

View File

@ -32,6 +32,7 @@
#include <unistd.h> #include <unistd.h>
#include <signal.h> #include <signal.h>
#include <execinfo.h> #include <execinfo.h>
#include <regex.h>
#if HAVE_SYSLOG_H #if HAVE_SYSLOG_H
# include <syslog.h> # include <syslog.h>
#endif #endif
@ -75,6 +76,17 @@ static char *virLogBuffer = NULL;
static int virLogLen = 0; static int virLogLen = 0;
static int virLogStart = 0; static int virLogStart = 0;
static int virLogEnd = 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 * Filters are used to refine the rules on what to keep or drop
@ -209,6 +221,12 @@ virLogOnceInit(void)
virLogStart = 0; virLogStart = 0;
virLogEnd = 0; virLogEnd = 0;
virLogDefaultPriority = VIR_LOG_DEFAULT; virLogDefaultPriority = VIR_LOG_DEFAULT;
if (VIR_ALLOC(virLogRegex) >= 0) {
if (regcomp(virLogRegex, VIR_LOG_REGEX, REG_EXTENDED) != 0)
VIR_FREE(virLogRegex);
}
virLogUnlock(); virLogUnlock();
if (pbm) if (pbm)
VIR_WARN("%s", pbm); VIR_WARN("%s", pbm);
@ -1587,3 +1605,19 @@ virLogSetFromEnv(void)
if (debugEnv && *debugEnv) if (debugEnv && *debugEnv)
virLogParseOutputs(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;
if (regexec(virLogRegex, str, 0, NULL, 0) == 0)
ret = true;
return ret;
}

View File

@ -188,4 +188,7 @@ extern void virLogVMessage(virLogSource src,
va_list vargs) ATTRIBUTE_FMT_PRINTF(7, 0); va_list vargs) ATTRIBUTE_FMT_PRINTF(7, 0);
extern int virLogSetBufferSize(int size); extern int virLogSetBufferSize(int size);
extern void virLogEmergencyDumpAll(int signum); extern void virLogEmergencyDumpAll(int signum);
bool virLogProbablyLogMessage(const char *str);
#endif #endif