summaryrefslogtreecommitdiff
path: root/lib/log_vty.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/log_vty.c')
-rw-r--r--lib/log_vty.c132
1 files changed, 132 insertions, 0 deletions
diff --git a/lib/log_vty.c b/lib/log_vty.c
index 01d19e679d..97026e5dbc 100644
--- a/lib/log_vty.c
+++ b/lib/log_vty.c
@@ -51,6 +51,11 @@ static struct zlog_cfg_file zt_file = {
static struct zlog_cfg_file zt_stdout = {
.prio_min = ZLOG_DISABLED,
};
+static struct zlog_cfg_filterfile zt_filterfile = {
+ .parent = {
+ .prio_min = ZLOG_DISABLED,
+ },
+};
static const char *zlog_progname;
static const char *zlog_protoname;
@@ -122,6 +127,7 @@ int log_level_match(const char *s)
void zlog_rotate(void)
{
zlog_file_rotate(&zt_file);
+ zlog_file_rotate(&zt_filterfile.parent);
hook_call(zlog_rotate);
}
@@ -164,6 +170,12 @@ DEFUN (show_logging,
zlog_priority[zt_file.prio_min], zt_file.filename);
vty_out(vty, "\n");
+ if (zt_filterfile.parent.prio_min != ZLOG_DISABLED
+ && zt_filterfile.parent.filename)
+ vty_out(vty, "Filtered-file logging: level %s, filename %s\n",
+ zlog_priority[zt_filterfile.parent.prio_min],
+ zt_filterfile.parent.filename);
+
if (log_cmdline_syslog_lvl != ZLOG_DISABLED)
vty_out(vty,
"From command line: \"--log syslog --log-level %s\"\n",
@@ -458,6 +470,8 @@ DEFUN (config_log_record_priority,
zlog_file_set_other(&zt_file);
zt_stdout.record_priority = true;
zlog_file_set_other(&zt_stdout);
+ zt_filterfile.parent.record_priority = true;
+ zlog_file_set_other(&zt_filterfile.parent);
return CMD_SUCCESS;
}
@@ -472,6 +486,8 @@ DEFUN (no_config_log_record_priority,
zlog_file_set_other(&zt_file);
zt_stdout.record_priority = false;
zlog_file_set_other(&zt_stdout);
+ zt_filterfile.parent.record_priority = false;
+ zlog_file_set_other(&zt_filterfile.parent);
return CMD_SUCCESS;
}
@@ -487,6 +503,8 @@ DEFPY (config_log_timestamp_precision,
zlog_file_set_other(&zt_file);
zt_stdout.ts_subsec = precision;
zlog_file_set_other(&zt_stdout);
+ zt_filterfile.parent.ts_subsec = precision;
+ zlog_file_set_other(&zt_filterfile.parent);
return CMD_SUCCESS;
}
@@ -503,6 +521,101 @@ DEFUN (no_config_log_timestamp_precision,
zlog_file_set_other(&zt_file);
zt_stdout.ts_subsec = 0;
zlog_file_set_other(&zt_stdout);
+ zt_filterfile.parent.ts_subsec = 0;
+ zlog_file_set_other(&zt_filterfile.parent);
+ return CMD_SUCCESS;
+}
+
+DEFPY (config_log_filterfile,
+ config_log_filterfile_cmd,
+ "log filtered-file FILENAME [<emergencies|alerts|critical|errors|warnings|notifications|informational|debugging>$levelarg]",
+ "Logging control\n"
+ "Logging to file with string filter\n"
+ "Logging filename\n"
+ LOG_LEVEL_DESC)
+{
+ int level = log_default_lvl;
+
+ if (levelarg) {
+ level = log_level_match(levelarg);
+ if (level == ZLOG_DISABLED)
+ return CMD_ERR_NO_MATCH;
+ }
+ return set_log_file(&zt_filterfile.parent, vty, filename, level);
+}
+
+DEFUN (no_config_log_filterfile,
+ no_config_log_filterfile_cmd,
+ "no log filtered-file [FILENAME [LEVEL]]",
+ NO_STR
+ "Logging control\n"
+ "Cancel logging to file with string filter\n"
+ "Logging file name\n"
+ "Logging level\n")
+{
+ zt_filterfile.parent.prio_min = ZLOG_DISABLED;
+ zlog_file_set_other(&zt_filterfile.parent);
+ return CMD_SUCCESS;
+}
+
+DEFPY (log_filter,
+ log_filter_cmd,
+ "[no] log-filter WORD$filter",
+ NO_STR
+ FILTER_LOG_STR
+ "String to filter by\n")
+{
+ int ret = 0;
+
+ if (no)
+ ret = zlog_filter_del(filter);
+ else
+ ret = zlog_filter_add(filter);
+
+ if (ret == 1) {
+ vty_out(vty, "%% filter table full\n");
+ return CMD_WARNING;
+ } else if (ret != 0) {
+ vty_out(vty, "%% failed to %s log filter\n",
+ (no ? "remove" : "apply"));
+ return CMD_WARNING;
+ }
+
+ vty_out(vty, " %s\n", filter);
+ return CMD_SUCCESS;
+}
+
+/* Clear all log filters */
+DEFPY (log_filter_clear,
+ log_filter_clear_cmd,
+ "clear log-filter",
+ CLEAR_STR
+ FILTER_LOG_STR)
+{
+ zlog_filter_clear();
+ return CMD_SUCCESS;
+}
+
+/* Show log filter */
+DEFPY (show_log_filter,
+ show_log_filter_cmd,
+ "show log-filter",
+ SHOW_STR
+ FILTER_LOG_STR)
+{
+ char log_filters[ZLOG_FILTERS_MAX * (ZLOG_FILTER_LENGTH_MAX + 3)] = "";
+ int len = 0;
+
+ len = zlog_filter_dump(log_filters, sizeof(log_filters));
+
+ if (len == -1) {
+ vty_out(vty, "%% failed to get filters\n");
+ return CMD_WARNING;
+ }
+
+ if (len != 0)
+ vty_out(vty, "%s", log_filters);
+
return CMD_SUCCESS;
}
@@ -518,6 +631,17 @@ void log_config_write(struct vty *vty)
vty_out(vty, "\n");
}
+ if (zt_filterfile.parent.prio_min != ZLOG_DISABLED
+ && zt_filterfile.parent.filename) {
+ vty_out(vty, "log filtered-file %s",
+ zt_filterfile.parent.filename);
+
+ if (zt_filterfile.parent.prio_min != log_default_lvl)
+ vty_out(vty, " %s",
+ zlog_priority[zt_filterfile.parent.prio_min]);
+ vty_out(vty, "\n");
+ }
+
if (log_config_stdout_lvl != ZLOG_DISABLED) {
vty_out(vty, "log stdout");
@@ -577,6 +701,8 @@ static int log_vty_init(const char *progname, const char *protoname,
zlog_progname = progname;
zlog_protoname = protoname;
+ zlog_filterfile_init(&zt_filterfile);
+
zlog_file_set_fd(&zt_stdout, STDOUT_FILENO);
return 0;
}
@@ -605,4 +731,10 @@ void log_cmd_init(void)
install_element(CONFIG_NODE, &no_config_log_record_priority_cmd);
install_element(CONFIG_NODE, &config_log_timestamp_precision_cmd);
install_element(CONFIG_NODE, &no_config_log_timestamp_precision_cmd);
+
+ install_element(VIEW_NODE, &show_log_filter_cmd);
+ install_element(CONFIG_NODE, &log_filter_cmd);
+ install_element(CONFIG_NODE, &log_filter_clear_cmd);
+ install_element(CONFIG_NODE, &config_log_filterfile_cmd);
+ install_element(CONFIG_NODE, &no_config_log_filterfile_cmd);
}