[ovs-dev] [PATCH 1/4] vlog: callback registration interface to receive vlog messages

Thomas Graf tgraf at redhat.com
Thu Nov 29 16:31:36 UTC 2012


New vlog function allowing to register a callback that will receive all
log messages.

Signed-off-by: Thomas Graf <tgraf at redhat.com>
---
 lib/vlog.c | 40 +++++++++++++++++++++++++++++++++++++++-
 lib/vlog.h |  8 +++++++-
 2 files changed, 46 insertions(+), 2 deletions(-)

diff --git a/lib/vlog.c b/lib/vlog.c
index 0bd9bd1..c57991a 100644
--- a/lib/vlog.c
+++ b/lib/vlog.c
@@ -569,6 +569,37 @@ vlog_is_enabled(const struct vlog_module *module, enum vlog_level level)
     return module->min_level >= level;
 }
 
+static struct list cb_log_funcs = LIST_INITIALIZER(&cb_log_funcs);
+
+struct vlog_cb
+{
+    struct list     list_node;
+    vlog_cb_func_t  func;
+};
+
+void
+vlog_register_cb(vlog_cb_func_t func)
+{
+    struct vlog_cb *cb;
+
+    if (!func)
+        return;
+
+    cb = xcalloc(1, sizeof(*cb));
+    cb->func = func;
+    list_push_front(&cb_log_funcs, &cb->list_node);
+}
+
+static void
+vlog_cb_broadcast(enum vlog_level level, unsigned int msg_num, const char *text)
+{
+    struct vlog_cb *cb;
+
+    LIST_FOR_EACH (cb, list_node, &cb_log_funcs) {
+        cb->func(level, msg_num, text);
+    }
+}
+
 static const char *
 fetch_braces(const char *p, const char *def, char *out, size_t out_size)
 {
@@ -698,7 +729,8 @@ vlog_valist(const struct vlog_module *module, enum vlog_level level,
     bool log_to_console = module->levels[VLF_CONSOLE] >= level;
     bool log_to_syslog = module->levels[VLF_SYSLOG] >= level;
     bool log_to_file = module->levels[VLF_FILE] >= level && log_fd >= 0;
-    if (log_to_console || log_to_syslog || log_to_file) {
+    bool log_to_cb = !list_is_empty(&cb_log_funcs);
+    if (log_to_console || log_to_syslog || log_to_file || log_to_cb) {
         int save_errno = errno;
         static unsigned int msg_num;
         struct ds s;
@@ -736,6 +768,12 @@ vlog_valist(const struct vlog_module *module, enum vlog_level level,
             vlog_write_file(&s);
         }
 
+        if (log_to_cb) {
+            format_log_message(module, level, VLF_CB, msg_num,
+                               message, args, &s);
+            vlog_cb_broadcast(level, msg_num, s.string);
+        }
+
         ds_destroy(&s);
         errno = save_errno;
     }
diff --git a/lib/vlog.h b/lib/vlog.h
index 9570b0e..8d4eac2 100644
--- a/lib/vlog.h
+++ b/lib/vlog.h
@@ -54,7 +54,8 @@ enum vlog_level vlog_get_level_val(const char *name);
 #define VLOG_FACILITIES                                                 \
     VLOG_FACILITY(SYSLOG, "%05N|%c%T|%p|%m")                            \
     VLOG_FACILITY(CONSOLE, "%D{%Y-%m-%dT%H:%M:%SZ}|%05N|%c%T|%p|%m")    \
-    VLOG_FACILITY(FILE, "%D{%Y-%m-%dT%H:%M:%SZ}|%05N|%c%T|%p|%m")
+    VLOG_FACILITY(FILE, "%D{%Y-%m-%dT%H:%M:%SZ}|%05N|%c%T|%p|%m")       \
+    VLOG_FACILITY(CB, "%D{%Y-%m-%dT%H:%M:%SZ} [%c%T] %p: %m")
 enum vlog_facility {
 #define VLOG_FACILITY(NAME, PATTERN) VLF_##NAME,
     VLOG_FACILITIES
@@ -126,6 +127,11 @@ const char *vlog_get_log_file(void);
 int vlog_set_log_file(const char *file_name);
 int vlog_reopen_log_file(void);
 
+/* Callback log registration */
+typedef void (*vlog_cb_func_t)(enum vlog_level lvl, unsigned int msg_num,
+                               const char *text);
+void vlog_register_cb(vlog_cb_func_t func);
+
 /* Initialization. */
 void vlog_init(void);
 void vlog_exit(void);
-- 
1.7.11.7




More information about the dev mailing list