vlib: add elog events for vlib log entries

Pretty interesting to see how long plugins take to load.

Type: improvement

Signed-off-by: Dave Barach <dave@barachs.net>
Change-Id: If496eb73b2e1fd9dd714142cd5195fa7ccd93ebd
diff --git a/src/vlib/log.c b/src/vlib/log.c
index e1ab036..bd456ae 100644
--- a/src/vlib/log.c
+++ b/src/vlib/log.c
@@ -18,12 +18,14 @@
 #include <vlib/log.h>
 #include <vlib/unix/unix.h>
 #include <syslog.h>
+#include <vppinfra/elog.h>
 
 vlib_log_main_t log_main = {
   .default_log_level = VLIB_LOG_LEVEL_NOTICE,
   .default_syslog_log_level = VLIB_LOG_LEVEL_WARNING,
   .unthrottle_time = 3,
   .size = 512,
+  .add_to_elog = 1,
   .default_rate_limit = 50,
 };
 
@@ -222,6 +224,36 @@
       e->timestamp = t;
       s = 0;
 
+      if (lm->add_to_elog)
+	{
+          /* *INDENT-OFF* */
+          ELOG_TYPE_DECLARE(ee) =
+            {
+             .format = "log-%s: %s",
+             .format_args = "t4T4",
+             .n_enum_strings = 9,
+             .enum_strings = {
+                "emerg",
+                "alert",
+                "crit",
+                "err",
+                "warn",
+                "notice",
+                "info",
+                "debug",
+                "disabled",
+                },
+            };
+          struct {
+            u32 log_level;
+            u32 string_index;
+          } *ed;
+          /* *INDENT-ON* */
+	  ed = ELOG_DATA (&vm->elog_main, ee);
+	  ed->log_level = level;
+	  ed->string_index = elog_string (&vm->elog_main, (char *) e->string);
+	}
+
       lm->next = (lm->next + 1) % lm->size;
       if (lm->size > lm->count)
 	lm->count++;
@@ -822,6 +854,8 @@
 			 unformat_vlib_log_level,
 			 &lm->default_syslog_log_level))
 	;
+      else if (unformat (input, "add-to-elog"))
+	lm->add_to_elog = 1;
       else if (unformat (input, "class %s %U", &class,
 			 unformat_vlib_cli_sub_input, &sub_input))
 	{
diff --git a/src/vlib/log.h b/src/vlib/log.h
index 75bdceb..a94c57a 100644
--- a/src/vlib/log.h
+++ b/src/vlib/log.h
@@ -108,6 +108,7 @@
   /* config */
   vlib_log_class_config_t *configs;
   uword *config_index_by_name;
+  int add_to_elog;
 
   /* registrations */
   vlib_log_class_registration_t *registrations;
diff --git a/src/vlib/main.c b/src/vlib/main.c
index f1de909..27cbcb0 100644
--- a/src/vlib/main.c
+++ b/src/vlib/main.c
@@ -823,8 +823,8 @@
 /* *INDENT-ON* */
 
 static clib_error_t *
-elog_resize (vlib_main_t * vm,
-	     unformat_input_t * input, vlib_cli_command_t * cmd)
+elog_resize_command_fn (vlib_main_t * vm,
+			unformat_input_t * input, vlib_cli_command_t * cmd)
 {
   elog_main_t *em = &vm->elog_main;
   u32 tmp;
@@ -848,7 +848,7 @@
 VLIB_CLI_COMMAND (elog_resize_cli, static) = {
   .path = "event-logger resize",
   .short_help = "event-logger resize <nnn>",
-  .function = elog_resize,
+  .function = elog_resize_command_fn,
 };
 /* *INDENT-ON* */
 
@@ -2051,8 +2051,9 @@
 	turn_on_mem_trace = 1;
 
       else if (unformat (input, "elog-events %d",
-			 &vm->elog_main.event_ring_size))
-	;
+			 &vm->configured_elog_ring_size))
+	vm->configured_elog_ring_size =
+	  1 << max_log2 (vm->configured_elog_ring_size);
       else if (unformat (input, "elog-post-mortem-dump"))
 	vm->elog_post_mortem_dump = 1;
       else if (unformat (input, "buffer-alloc-success-rate %f",
@@ -2133,11 +2134,10 @@
 
   vm->queue_signal_callback = placeholder_queue_signal_callback;
 
-  /* Turn on event log. */
-  if (!vm->elog_main.event_ring_size)
-    vm->elog_main.event_ring_size = 128 << 10;
-  elog_init (&vm->elog_main, vm->elog_main.event_ring_size);
-  elog_enable_disable (&vm->elog_main, 1);
+  /* Reconfigure event log which is enabled very early */
+  if (vm->configured_elog_ring_size &&
+      vm->configured_elog_ring_size != vm->elog_main.event_ring_size)
+    elog_resize (&vm->elog_main, vm->configured_elog_ring_size);
   vl_api_set_elog_main (&vm->elog_main);
   (void) vl_api_set_elog_trace_api_messages (1);
 
diff --git a/src/vlib/main.h b/src/vlib/main.h
index c420d5f..766c9ec 100644
--- a/src/vlib/main.h
+++ b/src/vlib/main.h
@@ -223,6 +223,7 @@
 
   /* Event logger. */
   elog_main_t elog_main;
+  u32 configured_elog_ring_size;
 
   /* Event logger trace flags */
   int elog_trace_api_messages;
diff --git a/src/vlib/unix/main.c b/src/vlib/unix/main.c
index 2f1b6ec..e86d421 100644
--- a/src/vlib/unix/main.c
+++ b/src/vlib/unix/main.c
@@ -706,6 +706,11 @@
 
   clib_time_init (&vm->clib_time);
 
+  /* Turn on the event logger at the first possible moment */
+  vm->configured_elog_ring_size = 128 << 10;
+  elog_init (&vm->elog_main, vm->configured_elog_ring_size);
+  elog_enable_disable (&vm->elog_main, 1);
+
   unformat_init_command_line (&input, (char **) vm->argv);
   if ((e = vlib_plugin_config (vm, &input)))
     {