]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Add method for checking if a string is (probably) a log message
authorDaniel P. Berrange <berrange@redhat.com>
Mon, 4 Mar 2013 20:46:32 +0000 (20:46 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Thu, 7 Mar 2013 18:56:52 +0000 (18:56 +0000)
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>
src/libvirt_private.syms
src/util/virlog.c
src/util/virlog.h

index ed464798fd54227099730cb177adfe7459915a55..599b71edd38570d07e54997d69ded88eb574617a 100644 (file)
@@ -1429,6 +1429,7 @@ virLogMessage;
 virLogParseDefaultPriority;
 virLogParseFilters;
 virLogParseOutputs;
+virLogProbablyLogMessage;
 virLogReset;
 virLogSetBufferSize;
 virLogSetDefaultPriority;
index 24ec9d3a7f3fdddd7098a1b4e94a80982cce09f3..130bdff1c23bb072c94016762fec9292bab2495f 100644 (file)
@@ -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,19 @@ 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;
+    if (regexec(virLogRegex, str, 0, NULL, 0) == 0)
+        ret = true;
+    return ret;
+}
index aa81d6a57887159a85db95be590ac231a3d58542..6b83245eced8f3b34cc5c18478eb72c9f557f5fc 100644 (file)
@@ -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