journald: convert journald to use parse_proc_cmdline

This makes journald use the common option parsing functionality.
One behavioural change is implemented:
"systemd.journald.forward_to_syslog" is now equivalent to
"systemd.journald.forward_to_syslog=1".
I think it's nicer to use this way.
This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2016-10-22 14:25:30 -04:00
parent 96287a4916
commit 5707ecf300
2 changed files with 74 additions and 92 deletions

View file

@ -301,22 +301,21 @@
<term><varname>ForwardToConsole=</varname></term> <term><varname>ForwardToConsole=</varname></term>
<term><varname>ForwardToWall=</varname></term> <term><varname>ForwardToWall=</varname></term>
<listitem><para>Control whether log messages received by the <listitem><para>Control whether log messages received by the journal daemon shall
journal daemon shall be forwarded to a traditional syslog be forwarded to a traditional syslog daemon, to the kernel log buffer (kmsg), to
daemon, to the kernel log buffer (kmsg), to the system the system console, or sent as wall messages to all logged-in users. These
console, or sent as wall messages to all logged-in users. options take boolean arguments. If forwarding to syslog is enabled but nothing
These options take boolean arguments. If forwarding to syslog reads messages from the socket, forwarding to syslog has no effect. By default,
is enabled but nothing reads messages from the socket, only forwarding to wall is enabled. These settings may be overridden at boot time
forwarding to syslog has no effect. By default, only with the kernel command line options
forwarding to wall is enabled. These settings may be <literal>systemd.journald.forward_to_syslog</literal>,
overridden at boot time with the kernel command line options <literal>systemd.journald.forward_to_kmsg</literal>,
<literal>systemd.journald.forward_to_syslog=</literal>, <literal>systemd.journald.forward_to_console</literal>, and
<literal>systemd.journald.forward_to_kmsg=</literal>, <literal>systemd.journald.forward_to_wall</literal>. If the option name is
<literal>systemd.journald.forward_to_console=</literal>, and specified without <literal>=</literal> and the following argument, true is
<literal>systemd.journald.forward_to_wall=</literal>. When assumed. Otherwise, the argument is parsed as a boolean. When forwarding to the
forwarding to the console, the TTY to log to can be changed console, the TTY to log to can be changed with <varname>TTYPath=</varname>,
with <varname>TTYPath=</varname>, described described below.</para></listitem>
below.</para></listitem>
</varlistentry> </varlistentry>
<varlistentry> <varlistentry>

View file

@ -1528,85 +1528,68 @@ static int setup_signals(Server *s) {
return 0; return 0;
} }
static int server_parse_proc_cmdline(Server *s) { static int parse_proc_cmdline_item(const char *key, const char *value, void *data) {
_cleanup_free_ char *line = NULL; Server *s = data;
const char *p;
int r; int r;
r = proc_cmdline(&line); assert(s);
if (r < 0) {
log_warning_errno(r, "Failed to read /proc/cmdline, ignoring: %m");
return 0;
}
p = line; if (streq(key, "systemd.journald.forward_to_syslog")) {
for (;;) { r = value ? parse_boolean(value) : true;
_cleanup_free_ char *word = NULL;
r = extract_first_word(&p, &word, NULL, 0);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse journald syntax \"%s\": %m", line); log_warning("Failed to parse forward to syslog switch \"%s\". Ignoring.", value);
if (r == 0)
break;
if (startswith(word, "systemd.journald.forward_to_syslog=")) {
r = parse_boolean(word + 35);
if (r < 0)
log_warning("Failed to parse forward to syslog switch %s. Ignoring.", word + 35);
else else
s->forward_to_syslog = r; s->forward_to_syslog = r;
} else if (startswith(word, "systemd.journald.forward_to_kmsg=")) { } else if (streq(key, "systemd.journald.forward_to_kmsg")) {
r = parse_boolean(word + 33); r = value ? parse_boolean(value) : true;
if (r < 0) if (r < 0)
log_warning("Failed to parse forward to kmsg switch %s. Ignoring.", word + 33); log_warning("Failed to parse forward to kmsg switch \"%s\". Ignoring.", value);
else else
s->forward_to_kmsg = r; s->forward_to_kmsg = r;
} else if (startswith(word, "systemd.journald.forward_to_console=")) { } else if (streq(key, "systemd.journald.forward_to_console")) {
r = parse_boolean(word + 36); r = value ? parse_boolean(value) : true;
if (r < 0) if (r < 0)
log_warning("Failed to parse forward to console switch %s. Ignoring.", word + 36); log_warning("Failed to parse forward to console switch \"%s\". Ignoring.", value);
else else
s->forward_to_console = r; s->forward_to_console = r;
} else if (startswith(word, "systemd.journald.forward_to_wall=")) { } else if (streq(key, "systemd.journald.forward_to_wall")) {
r = parse_boolean(word + 33); r = value ? parse_boolean(value) : true;
if (r < 0) if (r < 0)
log_warning("Failed to parse forward to wall switch %s. Ignoring.", word + 33); log_warning("Failed to parse forward to wall switch \"%s\". Ignoring.", value);
else else
s->forward_to_wall = r; s->forward_to_wall = r;
} else if (startswith(word, "systemd.journald.max_level_console=")) { } else if (streq(key, "systemd.journald.max_level_console") && value) {
r = log_level_from_string(word + 35); r = log_level_from_string(value);
if (r < 0) if (r < 0)
log_warning("Failed to parse max level console value %s. Ignoring.", word + 35); log_warning("Failed to parse max level console value \"%s\". Ignoring.", value);
else else
s->max_level_console = r; s->max_level_console = r;
} else if (startswith(word, "systemd.journald.max_level_store=")) { } else if (streq(key, "systemd.journald.max_level_store") && value) {
r = log_level_from_string(word + 33); r = log_level_from_string(value);
if (r < 0) if (r < 0)
log_warning("Failed to parse max level store value %s. Ignoring.", word + 33); log_warning("Failed to parse max level store value \"%s\". Ignoring.", value);
else else
s->max_level_store = r; s->max_level_store = r;
} else if (startswith(word, "systemd.journald.max_level_syslog=")) { } else if (streq(key, "systemd.journald.max_level_syslog") && value) {
r = log_level_from_string(word + 34); r = log_level_from_string(value);
if (r < 0) if (r < 0)
log_warning("Failed to parse max level syslog value %s. Ignoring.", word + 34); log_warning("Failed to parse max level syslog value \"%s\". Ignoring.", value);
else else
s->max_level_syslog = r; s->max_level_syslog = r;
} else if (startswith(word, "systemd.journald.max_level_kmsg=")) { } else if (streq(key, "systemd.journald.max_level_kmsg") && value) {
r = log_level_from_string(word + 32); r = log_level_from_string(value);
if (r < 0) if (r < 0)
log_warning("Failed to parse max level kmsg value %s. Ignoring.", word + 32); log_warning("Failed to parse max level kmsg value \"%s\". Ignoring.", value);
else else
s->max_level_kmsg = r; s->max_level_kmsg = r;
} else if (startswith(word, "systemd.journald.max_level_wall=")) { } else if (streq(key, "systemd.journald.max_level_wall") && value) {
r = log_level_from_string(word + 32); r = log_level_from_string(value);
if (r < 0) if (r < 0)
log_warning("Failed to parse max level wall value %s. Ignoring.", word + 32); log_warning("Failed to parse max level wall value \"%s\". Ignoring.", value);
else else
s->max_level_wall = r; s->max_level_wall = r;
} else if (startswith(word, "systemd.journald")) } else if (startswith(key, "systemd.journald"))
log_warning("Invalid systemd.journald parameter. Ignoring."); log_warning("Unknown journald kernel command line option \"%s\". Ignoring.", key);
}
/* do not warn about state here, since probably systemd already did */ /* do not warn about state here, since probably systemd already did */
return 0; return 0;
@ -1917,7 +1900,7 @@ int server_init(Server *s) {
journal_reset_metrics(&s->runtime_storage.metrics); journal_reset_metrics(&s->runtime_storage.metrics);
server_parse_config_file(s); server_parse_config_file(s);
server_parse_proc_cmdline(s); parse_proc_cmdline(parse_proc_cmdline_item, s);
if (!!s->rate_limit_interval ^ !!s->rate_limit_burst) { if (!!s->rate_limit_interval ^ !!s->rate_limit_burst) {
log_debug("Setting both rate limit interval and burst from "USEC_FMT",%u to 0,0", log_debug("Setting both rate limit interval and burst from "USEC_FMT",%u to 0,0",