Keep statistics of logged warnings
authorHenning Rogge <henning.rogge@fkie.fraunhofer.de>
Thu, 16 Feb 2017 07:06:45 +0000 (08:06 +0100)
committerHenning Rogge <henning.rogge@fkie.fraunhofer.de>
Thu, 16 Feb 2017 07:06:45 +0000 (08:06 +0100)
src-api/core/oonf_logging.c
src-api/core/oonf_logging.h
src-plugins/generic/systeminfo/systeminfo.c

index f027c6f..de8adc4 100644 (file)
@@ -90,6 +90,8 @@ const char *LOG_SEVERITY_NAMES[LOG_SEVERITY_MAX+1] = {
   [LOG_SEVERITY_WARN]  = "WARN",
 };
 
+static uint32_t _log_warnings[LOG_MAXIMUM_SOURCES];
+
 /**
  * Initialize logging system
  * @param data builddata defined by application
@@ -143,6 +145,8 @@ oonf_log_init(const struct oonf_appdata *data, enum oonf_log_severity def_severi
   /* clear global mask */
   memset(&log_global_mask, _default_mask, sizeof(log_global_mask));
 
+  /* clear warning counter */
+  memset(_log_warnings, 0, sizeof(_log_warnings));
   return 0;
 }
 
@@ -250,6 +254,15 @@ oonf_log_get_sourcecount(void) {
   return _source_count;
 }
 
+/**
+ * @param source logging source
+ * @return number of warnings since start for this source
+ */
+uint32_t
+oonf_log_get_warning_count(enum oonf_log_source source) {
+  return _log_warnings[source];
+}
+
 /**
  * @return pointer to application data
  */
@@ -370,6 +383,12 @@ oonf_log(enum oonf_log_severity severity, enum oonf_log_source source, bool no_h
   va_list ap;
   int p1 = 0, p2 = 0;
 
+  if (severity == LOG_SEVERITY_WARN) {
+    /* count warnings */
+    _log_warnings[source]++;
+    _log_warnings[LOG_ALL]++;
+  }
+
   va_start(ap, format);
 
   /* generate log string */
index 8b6416d..3ce0e03 100644 (file)
@@ -384,6 +384,8 @@ EXPORT size_t oonf_log_get_max_severitytextlen(void);
 EXPORT size_t oonf_log_get_max_sourcetextlen(void);
 EXPORT size_t oonf_log_get_sourcecount(void);
 
+EXPORT uint32_t oonf_log_get_warning_count(enum oonf_log_source source);
+
 EXPORT void oonf_log_addhandler(struct oonf_log_handler_entry *);
 EXPORT void oonf_log_removehandler(struct oonf_log_handler_entry *);
 EXPORT int oonf_log_register_source(const char *name);
index 775d35b..4753359 100644 (file)
@@ -78,12 +78,15 @@ static void _initialize_timer_values(
     struct oonf_viewer_template *template, struct oonf_timer_class *tc);
 static void _initialize_socket_values(
     struct oonf_viewer_template *template, struct oonf_socket_entry *sock);
+static void _initialize_logging_values(
+    struct oonf_viewer_template *template, enum oonf_log_source source);
 
 static int _cb_create_text_time(struct oonf_viewer_template *);
 static int _cb_create_text_version(struct oonf_viewer_template *);
 static int _cb_create_text_memory(struct oonf_viewer_template *);
 static int _cb_create_text_timer(struct oonf_viewer_template *);
 static int _cb_create_text_socket(struct oonf_viewer_template *);
+static int _cb_create_text_logging(struct oonf_viewer_template *);
 
 /*
  * list of template keys and corresponding buffers for values.
@@ -139,6 +142,12 @@ static int _cb_create_text_socket(struct oonf_viewer_template *);
 /*! template key for socket long usage events */
 #define KEY_SOCKET_LONG                 "socket_long"
 
+/*! template key for name of logging source */
+#define KEY_LOG_SOURCE                  "log_source"
+
+/*! template key for number of warnings per logging source */
+#define KEY_LOG_WARNINGS                "log_warnings"
+
 /*
  * buffer space for values that will be assembled
  * into the output of the plugin
@@ -165,6 +174,9 @@ static struct isonumber_str             _value_socket_recv;
 static struct isonumber_str             _value_socket_send;
 static struct isonumber_str             _value_socket_long;
 
+static char                             _value_log_source[64];
+static struct isonumber_str             _value_log_warnings;
+
 /* definition of the template data entries for JSON and table output */
 static struct abuf_template_data_entry _tde_time_key[] = {
     { KEY_TIME_SYSTEM, _value_system_time.buf, true },
@@ -194,6 +206,10 @@ static struct abuf_template_data_entry _tde_socket_key[] = {
     { KEY_SOCKET_SEND, _value_socket_send.buf, false },
     { KEY_SOCKET_LONG, _value_socket_long.buf, false },
 };
+static struct abuf_template_data_entry _tde_logging_key[] = {
+    { KEY_LOG_SOURCE, _value_log_source, true },
+    { KEY_LOG_WARNINGS, _value_log_warnings.buf, false },
+};
 
 static struct abuf_template_storage _template_storage;
 
@@ -213,6 +229,9 @@ static struct abuf_template_data _td_timer[] = {
 static struct abuf_template_data _td_socket[] = {
     { _tde_socket_key, ARRAYSIZE(_tde_socket_key) },
 };
+static struct abuf_template_data _td_logging[] = {
+    { _tde_logging_key, ARRAYSIZE(_tde_logging_key) },
+};
 
 /* OONF viewer templates (based on Template Data arrays) */
 static struct oonf_viewer_template _templates[] = {
@@ -246,6 +265,12 @@ static struct oonf_viewer_template _templates[] = {
         .json_name = "socket",
         .cb_function = _cb_create_text_socket,
     },
+    {
+        .data = _td_logging,
+        .data_size = ARRAYSIZE(_td_logging),
+        .json_name = "logging",
+        .cb_function = _cb_create_text_logging,
+    },
 };
 
 /* telnet command of this plugin */
@@ -387,6 +412,19 @@ _initialize_socket_values(struct oonf_viewer_template *template,
       oonf_socket_get_long(sock), "", 0, false, template->create_raw);
 }
 
+/**
+ * Initialize the value buffers for a logging source
+ * @param template
+ * @param source
+ */
+static void _initialize_logging_values(
+    struct oonf_viewer_template *template, enum oonf_log_source source) {
+  strscpy(_value_log_source, LOG_SOURCE_NAMES[source],
+      sizeof(_value_log_source));
+  isonumber_from_u64(&_value_log_warnings,
+      oonf_log_get_warning_count(source), "", 0, false, template->create_raw);
+}
+
 /**
  * Callback to generate text/json description of current time
  * @param template viewer template
@@ -473,3 +511,22 @@ _cb_create_text_socket(struct oonf_viewer_template *template) {
 
   return 0;
 }
+
+/**
+ * Callback to generate text/json description for logging sources
+ * @param template viewer template
+ * @return -1 if an error happened, 0 otherwise
+ */
+static int
+_cb_create_text_logging(struct oonf_viewer_template *template) {
+  enum oonf_log_source source;
+
+  for (source = 0; source < oonf_log_get_sourcecount(); source++) {
+    _initialize_logging_values(template, source);
+
+    /* generate template output */
+    oonf_viewer_output_print_line(template);
+  }
+
+  return 0;
+}