lib: autodetect systemd/journald log on stdout

systemd sets up environment variables to allow autodetecting and
switching the log format to journald native.  Make use of that for the
stdout logging target.

Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
This commit is contained in:
David Lamparter 2022-01-16 16:15:41 +01:00
parent 1c6261a99e
commit 29bb23de31
2 changed files with 75 additions and 27 deletions

View file

@ -27,6 +27,7 @@
#include "lib/zlog_5424.h" #include "lib/zlog_5424.h"
#include "lib/lib_errors.h" #include "lib/lib_errors.h"
#include "lib/printfrr.h" #include "lib/printfrr.h"
#include "lib/systemd.h"
#ifndef VTYSH_EXTRACT_PL #ifndef VTYSH_EXTRACT_PL
#include "lib/log_vty_clippy.c" #include "lib/log_vty_clippy.c"
@ -52,15 +53,34 @@ static struct zlog_cfg_file zt_file_cmdline = {
static struct zlog_cfg_file zt_file = { static struct zlog_cfg_file zt_file = {
.prio_min = ZLOG_DISABLED, .prio_min = ZLOG_DISABLED,
}; };
static struct zlog_cfg_file zt_stdout = {
.prio_min = ZLOG_DISABLED,
};
static struct zlog_cfg_filterfile zt_filterfile = { static struct zlog_cfg_filterfile zt_filterfile = {
.parent = { .parent = {
.prio_min = ZLOG_DISABLED, .prio_min = ZLOG_DISABLED,
}, },
}; };
static struct zlog_cfg_file zt_stdout_file = {
.prio_min = ZLOG_DISABLED,
};
static struct zlog_cfg_5424 zt_stdout_journald = {
.prio_min = ZLOG_DISABLED,
.fmt = ZLOG_FMT_JOURNALD,
.dst = ZLOG_5424_DST_UNIX,
.filename = "/run/systemd/journal/socket",
/* this can't be changed through config since this target substitutes
* in for the "plain" stdout target
*/
.facility = LOG_DAEMON,
.kw_version = false,
.kw_location = true,
.kw_uid = true,
.kw_ec = true,
.kw_args = true,
};
static bool stdout_journald_in_use;
const char *zlog_progname; const char *zlog_progname;
static const char *zlog_protoname; static const char *zlog_protoname;
@ -163,14 +183,18 @@ DEFUN_NOSH (show_logging,
SHOW_STR SHOW_STR
"Show current logging configuration\n") "Show current logging configuration\n")
{ {
int stdout_prio;
log_show_syslog(vty); log_show_syslog(vty);
stdout_prio = stdout_journald_in_use ? zt_stdout_journald.prio_min
: zt_stdout_file.prio_min;
vty_out(vty, "Stdout logging: "); vty_out(vty, "Stdout logging: ");
if (zt_stdout.prio_min == ZLOG_DISABLED) if (stdout_prio == ZLOG_DISABLED)
vty_out(vty, "disabled"); vty_out(vty, "disabled");
else else
vty_out(vty, "level %s", vty_out(vty, "level %s", zlog_priority[stdout_prio]);
zlog_priority[zt_stdout.prio_min]);
vty_out(vty, "\n"); vty_out(vty, "\n");
vty_out(vty, "File logging: "); vty_out(vty, "File logging: ");
@ -210,6 +234,21 @@ DEFUN_NOSH (show_logging,
return CMD_SUCCESS; return CMD_SUCCESS;
} }
static void log_stdout_apply_level(void)
{
int maxlvl;
maxlvl = ZLOG_MAXLVL(log_config_stdout_lvl, log_cmdline_stdout_lvl);
if (stdout_journald_in_use) {
zt_stdout_journald.prio_min = maxlvl;
zlog_5424_apply_meta(&zt_stdout_journald);
} else {
zt_stdout_file.prio_min = maxlvl;
zlog_file_set_other(&zt_stdout_file);
}
}
DEFPY (config_log_stdout, DEFPY (config_log_stdout,
config_log_stdout_cmd, config_log_stdout_cmd,
"log stdout [<emergencies|alerts|critical|errors|warnings|notifications|informational|debugging>$levelarg]", "log stdout [<emergencies|alerts|critical|errors|warnings|notifications|informational|debugging>$levelarg]",
@ -227,9 +266,7 @@ DEFPY (config_log_stdout,
level = log_default_lvl; level = log_default_lvl;
log_config_stdout_lvl = level; log_config_stdout_lvl = level;
zt_stdout.prio_min = ZLOG_MAXLVL(log_config_stdout_lvl, log_stdout_apply_level();
log_cmdline_stdout_lvl);
zlog_file_set_other(&zt_stdout);
return CMD_SUCCESS; return CMD_SUCCESS;
} }
@ -242,9 +279,7 @@ DEFUN (no_config_log_stdout,
LOG_LEVEL_DESC) LOG_LEVEL_DESC)
{ {
log_config_stdout_lvl = ZLOG_DISABLED; log_config_stdout_lvl = ZLOG_DISABLED;
zt_stdout.prio_min = ZLOG_MAXLVL(log_config_stdout_lvl, log_stdout_apply_level();
log_cmdline_stdout_lvl);
zlog_file_set_other(&zt_stdout);
return CMD_SUCCESS; return CMD_SUCCESS;
} }
@ -378,9 +413,7 @@ void command_setup_early_logging(const char *dest, const char *level)
if (strcmp(type, "stdout") == 0) { if (strcmp(type, "stdout") == 0) {
log_cmdline_stdout_lvl = nlevel; log_cmdline_stdout_lvl = nlevel;
zt_stdout.prio_min = ZLOG_MAXLVL(log_config_stdout_lvl, log_stdout_apply_level();
log_cmdline_stdout_lvl);
zlog_file_set_other(&zt_stdout);
return; return;
} }
if (strcmp(type, "syslog") == 0) { if (strcmp(type, "syslog") == 0) {
@ -414,9 +447,7 @@ DEFUN (clear_log_cmdline,
log_cmdline_syslog_lvl)); log_cmdline_syslog_lvl));
log_cmdline_stdout_lvl = ZLOG_DISABLED; log_cmdline_stdout_lvl = ZLOG_DISABLED;
zt_stdout.prio_min = ZLOG_MAXLVL(log_config_stdout_lvl, log_stdout_apply_level();
log_cmdline_stdout_lvl);
zlog_file_set_other(&zt_stdout);
return CMD_SUCCESS; return CMD_SUCCESS;
} }
@ -524,8 +555,10 @@ DEFUN (config_log_record_priority,
{ {
zt_file.record_priority = true; zt_file.record_priority = true;
zlog_file_set_other(&zt_file); zlog_file_set_other(&zt_file);
zt_stdout.record_priority = true; if (!stdout_journald_in_use) {
zlog_file_set_other(&zt_stdout); zt_stdout_file.record_priority = true;
zlog_file_set_other(&zt_stdout_file);
}
zt_filterfile.parent.record_priority = true; zt_filterfile.parent.record_priority = true;
zlog_file_set_other(&zt_filterfile.parent); zlog_file_set_other(&zt_filterfile.parent);
return CMD_SUCCESS; return CMD_SUCCESS;
@ -540,8 +573,10 @@ DEFUN (no_config_log_record_priority,
{ {
zt_file.record_priority = false; zt_file.record_priority = false;
zlog_file_set_other(&zt_file); zlog_file_set_other(&zt_file);
zt_stdout.record_priority = false; if (!stdout_journald_in_use) {
zlog_file_set_other(&zt_stdout); zt_stdout_file.record_priority = false;
zlog_file_set_other(&zt_stdout_file);
}
zt_filterfile.parent.record_priority = false; zt_filterfile.parent.record_priority = false;
zlog_file_set_other(&zt_filterfile.parent); zlog_file_set_other(&zt_filterfile.parent);
return CMD_SUCCESS; return CMD_SUCCESS;
@ -557,8 +592,10 @@ DEFPY (config_log_timestamp_precision,
{ {
zt_file.ts_subsec = precision; zt_file.ts_subsec = precision;
zlog_file_set_other(&zt_file); zlog_file_set_other(&zt_file);
zt_stdout.ts_subsec = precision; if (!stdout_journald_in_use) {
zlog_file_set_other(&zt_stdout); zt_stdout_file.ts_subsec = precision;
zlog_file_set_other(&zt_stdout_file);
}
zt_filterfile.parent.ts_subsec = precision; zt_filterfile.parent.ts_subsec = precision;
zlog_file_set_other(&zt_filterfile.parent); zlog_file_set_other(&zt_filterfile.parent);
return CMD_SUCCESS; return CMD_SUCCESS;
@ -575,8 +612,10 @@ DEFUN (no_config_log_timestamp_precision,
{ {
zt_file.ts_subsec = 0; zt_file.ts_subsec = 0;
zlog_file_set_other(&zt_file); zlog_file_set_other(&zt_file);
zt_stdout.ts_subsec = 0; if (!stdout_journald_in_use) {
zlog_file_set_other(&zt_stdout); zt_stdout_file.ts_subsec = 0;
zlog_file_set_other(&zt_stdout_file);
}
zt_filterfile.parent.ts_subsec = 0; zt_filterfile.parent.ts_subsec = 0;
zlog_file_set_other(&zt_filterfile.parent); zlog_file_set_other(&zt_filterfile.parent);
return CMD_SUCCESS; return CMD_SUCCESS;
@ -822,7 +861,12 @@ static int log_vty_init(const char *progname, const char *protoname,
zlog_filterfile_init(&zt_filterfile); zlog_filterfile_init(&zt_filterfile);
zlog_file_set_fd(&zt_stdout, STDOUT_FILENO); if (sd_stdout_is_journal) {
stdout_journald_in_use = true;
zlog_5424_init(&zt_stdout_journald);
zlog_5424_apply_dst(&zt_stdout_journald);
} else
zlog_file_set_fd(&zt_stdout_file, STDOUT_FILENO);
return 0; return 0;
} }

View file

@ -23,6 +23,10 @@
extern "C" { extern "C" {
#endif #endif
/* fd 1/2 connected to journald? */
extern bool sd_stdout_is_journal;
extern bool sd_stderr_is_journal;
/* /*
* Wrapper functions to systemd calls. * Wrapper functions to systemd calls.
* *