diff options
-rw-r--r-- | src/install.c | 3 | ||||
-rw-r--r-- | src/log.c | 47 | ||||
-rw-r--r-- | src/log.h | 7 | ||||
-rw-r--r-- | src/main.c | 68 |
4 files changed, 108 insertions, 17 deletions
diff --git a/src/install.c b/src/install.c index c3dbe8b195..479a38c80a 100644 --- a/src/install.c +++ b/src/install.c @@ -60,6 +60,7 @@ Hashmap *will_install = NULL, *have_installed = NULL; static int help(void) { printf("%s [options]\n\n" + "Install init system units.\n\n" " -h --help Show this help\n" " --force Override existing links\n" " --system Install into system\n" @@ -532,8 +533,6 @@ int main(int argc, char *argv[]) { zero(paths); - log_set_target(LOG_TARGET_CONSOLE); - log_set_max_level(LOG_INFO); log_parse_environment(); if ((r = parse_argv(argc, argv)) < 0) @@ -35,12 +35,15 @@ #define LOG_BUFFER_MAX 1024 static LogTarget log_target = LOG_TARGET_CONSOLE; -static int log_max_level = LOG_DEBUG; +static int log_max_level = LOG_INFO; static int console_fd = STDERR_FILENO; static int syslog_fd = -1; static int kmsg_fd = -1; +static bool show_color = false; +static bool show_location = false; + /* Akin to glibc's __abort_msg; which is private and we hance cannot * use here. */ static char *log_abort_msg = NULL; @@ -218,10 +221,11 @@ static int write_to_console( snprintf(location, sizeof(location), "(%s:%u) ", file, line); char_array_0(location); - highlight = LOG_PRI(level) <= LOG_ERR; + highlight = LOG_PRI(level) <= LOG_ERR && show_color; zero(iovec); - IOVEC_SET_STRING(iovec[n++], location); + if (show_location) + IOVEC_SET_STRING(iovec[n++], location); if (highlight) IOVEC_SET_STRING(iovec[n++], "\x1B[1;31m"); IOVEC_SET_STRING(iovec[n++], buffer); @@ -469,6 +473,15 @@ void log_parse_environment(void) { if ((e = getenv("SYSTEMD_LOG_LEVEL"))) if (log_set_max_level_from_string(e) < 0) log_warning("Failed to parse log level %s. Ignoring.", e); + + if ((e = getenv("SYSTEMD_SHOW_COLOR"))) + if (log_show_color_from_string(e) < 0) + log_warning("Failed to parse bool %s. Ignoring.", e); + + if ((e = getenv("SYSTEMD_SHOW_LOCATION"))) { + if (log_show_location_from_string(e) < 0) + log_warning("Failed to parse bool %s. Ignoring.", e); + } } LogTarget log_get_target(void) { @@ -479,6 +492,34 @@ int log_get_max_level(void) { return log_max_level; } +void log_show_color(bool b) { + show_color = b; +} + +void log_show_location(bool b) { + show_location = b; +} + +int log_show_color_from_string(const char *e) { + int t; + + if ((t = parse_boolean(e)) < 0) + return -EINVAL; + + log_show_color(t); + return 0; +} + +int log_show_location_from_string(const char *e) { + int t; + + if ((t = parse_boolean(e)) < 0) + return -EINVAL; + + log_show_location(t); + return 0; +} + static const char *const log_target_table[] = { [LOG_TARGET_CONSOLE] = "console", [LOG_TARGET_SYSLOG] = "syslog", @@ -23,6 +23,7 @@ ***/ #include <syslog.h> +#include <stdbool.h> #include "macro.h" @@ -44,6 +45,12 @@ void log_set_max_level(int level); int log_set_target_from_string(const char *e); int log_set_max_level_from_string(const char *e); +void log_show_color(bool b); +void log_show_location(bool b); + +int log_show_color_from_string(const char *e); +int log_show_location_from_string(const char *e); + LogTarget log_get_target(void); int log_get_max_level(void); diff --git a/src/main.c b/src/main.c index e5bdf849be..ec2733e185 100644 --- a/src/main.c +++ b/src/main.c @@ -246,6 +246,16 @@ static int parse_proc_cmdline_word(const char *word) { if (log_set_max_level_from_string(word + 18) < 0) log_warning("Failed to parse log level %s. Ignoring.", word + 18); + } else if (startswith(word, "systemd.log_color=")) { + + if (log_show_color_from_string(word + 18) < 0) + log_warning("Failed to parse log color setting %s. Ignoring.", word + 18); + + } else if (startswith(word, "systemd.log_location=")) { + + if (log_show_location_from_string(word + 21) < 0) + log_warning("Failed to parse log location setting %s. Ignoring.", word + 21); + } else if (startswith(word, "systemd.dump_core=")) { int r; @@ -283,14 +293,17 @@ static int parse_proc_cmdline_word(const char *word) { log_warning("Unknown kernel switch %s. Ignoring.", word); - log_info("Supported kernel switches:"); - log_info("systemd.unit=UNIT Default unit to start"); - log_info("systemd.log_target=console|kmsg|syslog Log target"); - log_info("systemd.log_level=LEVEL Log level"); - log_info("systemd.dump_core=0|1 Dump core on crash"); - log_info("systemd.crash_shell=0|1 On crash run shell"); - log_info("systemd.crash_chvt=N Change to VT #N on crash"); - log_info("systemd.confirm_spawn=0|1 Confirm every process spawn"); + log_info("Supported kernel switches:\n" + "systemd.unit=UNIT Default unit to start\n" + "systemd.log_target=console|kmsg|syslog| Log target\n" + " syslog-org-kmsg|null\n" + "systemd.log_level=LEVEL Log level\n" + "systemd.log_color=0|1 Highlight important log messages\n" + "systemd.log_location=0|1 Include code location in log messages\n" + "systemd.dump_core=0|1 Dump core on crash\n" + "systemd.crash_shell=0|1 On crash run shell\n" + "systemd.crash_chvt=N Change to VT #N on crash\n" + "systemd.confirm_spawn=0|1 Confirm every process spawn"); } else { unsigned i; @@ -343,6 +356,8 @@ static int parse_argv(int argc, char *argv[]) { enum { ARG_LOG_LEVEL = 0x100, ARG_LOG_TARGET, + ARG_LOG_COLOR, + ARG_LOG_LOCATION, ARG_UNIT, ARG_RUNNING_AS, ARG_TEST, @@ -355,6 +370,8 @@ static int parse_argv(int argc, char *argv[]) { static const struct option options[] = { { "log-level", required_argument, NULL, ARG_LOG_LEVEL }, { "log-target", required_argument, NULL, ARG_LOG_TARGET }, + { "log-color", optional_argument, NULL, ARG_LOG_COLOR }, + { "log-location", optional_argument, NULL, ARG_LOG_LOCATION }, { "unit", required_argument, NULL, ARG_UNIT }, { "running-as", required_argument, NULL, ARG_RUNNING_AS }, { "test", no_argument, NULL, ARG_TEST }, @@ -392,6 +409,24 @@ static int parse_argv(int argc, char *argv[]) { break; + case ARG_LOG_COLOR: + + if ((r = log_show_color_from_string(optarg)) < 0) { + log_error("Failed to parse log color setting %s.", optarg); + return r; + } + + break; + + case ARG_LOG_LOCATION: + + if ((r = log_show_location_from_string(optarg)) < 0) { + log_error("Failed to parse log location setting %s.", optarg); + return r; + } + + break; + case ARG_UNIT: if ((r = set_default_unit(optarg)) < 0) { @@ -495,15 +530,18 @@ static int parse_argv(int argc, char *argv[]) { static int help(void) { printf("%s [options]\n\n" + "Starts up and maintains the system or a session.\n\n" " -h --help Show this help\n" " --unit=UNIT Set default unit\n" - " --log-level=LEVEL Set log level\n" - " --log-target=TARGET Set log target (console, syslog, kmsg, syslog-or-kmsg)\n" " --running-as=AS Set running as (init, system, session)\n" " --test Determine startup sequence, dump it and exit\n" " --dump-configuration-items Dump understood unit configuration items\n" " --confirm-spawn Ask for confirmation when spawning processes\n" - " --introspect[=INTERFACE] Extract D-Bus interface data\n", + " --introspect[=INTERFACE] Extract D-Bus interface data\n" + " --log-level=LEVEL Set log level\n" + " --log-target=TARGET Set log target (console, syslog, kmsg, syslog-or-kmsg, null)\n" + " --log-color[=0|1] Highlight import log messages\n" + " --log-location[=0|1] Include code location in log messages\n", program_invocation_short_name); return 0; @@ -571,11 +609,17 @@ int main(int argc, char *argv[]) { FDSet *fds = NULL; bool reexecute = false; + log_show_color(true); + log_show_location(false); + log_set_max_level(LOG_DEBUG); + if (getpid() == 1) { running_as = MANAGER_INIT; log_set_target(LOG_TARGET_SYSLOG_OR_KMSG); - } else + } else { running_as = MANAGER_SESSION; + log_set_target(LOG_TARGET_CONSOLE); + } if (set_default_unit(SPECIAL_DEFAULT_TARGET) < 0) goto finish; |