log: make color/location logging optional

This commit is contained in:
Lennart Poettering 2010-06-17 22:52:55 +02:00
parent 3ba686c107
commit bbe63281ea
4 changed files with 108 additions and 17 deletions

View File

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

View File

@ -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",

View File

@ -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);

View File

@ -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;