From cbb0fd3cfdc287f6f4653ef1f04a7cfb2ea51b27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= Date: Fri, 20 Apr 2018 17:38:56 +0100 Subject: [PATCH] log: support logging using shell wildcard syntax MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rather than specialcasing handling of the '*' character, use fnmatch() to get normal shell wildcard syntax, as described in 'man glob(7)'. To get an indication of the performance impact of using globs instead of plain string matches, a test program was written. The list of all 260 log categories was extracted from the source. Then a typical log filters setup was picked by creating an array of the strings "qemu", "security", "util", "cgroup", "event", "object". Every filter string was matched against every log category. Timing information showed that using strstr() this took 8 microseconds, while fnmatch() took 114 microseconds. IOW, fnmatch is 14 times slower than our existing strstr check. These numbers show a worst case scenario that will never be hit, because it is rare that every log category would have data output. The log category matches are cached, so each category is only checked once no matter how many log statements are emitted. IOW despite being slower, this will be lost in the noise and have no consequence on real world logging performance. Reviewed-by: John Ferlan Signed-off-by: Daniel P. Berrangé --- src/util/virlog.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/util/virlog.c b/src/util/virlog.c index 5262d613f6..be9fc0cf78 100644 --- a/src/util/virlog.c +++ b/src/util/virlog.c @@ -40,6 +40,7 @@ #if HAVE_SYS_UN_H # include #endif +#include #include "virerror.h" #include "virlog.h" @@ -508,7 +509,7 @@ virLogSourceUpdate(virLogSourcePtr source) size_t i; for (i = 0; i < virLogNbFilters; i++) { - if (strstr(source->name, virLogFilters[i]->match)) { + if (fnmatch(virLogFilters[i]->match, source->name, 0) == 0) { priority = virLogFilters[i]->priority; flags = virLogFilters[i]->flags; break; -- GitLab