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)))
{