From: Lennart Poettering Date: Tue, 29 Sep 2020 11:06:12 +0000 (+0200) Subject: log: optionally display thread ID in log output to tty X-Git-Tag: v247-rc1~148^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=9ee806d1a80d7aa9d85fc91dca48e7b37efcb053;p=thirdparty%2Fsystemd.git log: optionally display thread ID in log output to tty This is very useful when playing around with threaded tests, but should be useful in other cases too. --- diff --git a/man/systemd.xml b/man/systemd.xml index a9040545c2a..5e7dc5be732 100644 --- a/man/systemd.xml +++ b/man/systemd.xml @@ -614,37 +614,38 @@ $SYSTEMD_LOG_COLOR - Controls whether systemd highlights important - log messages. This can be overridden with - . + Controls whether systemd highlights important log messages. This can be overridden + with . $SYSTEMD_LOG_LEVEL - systemd reads the log level from this - environment variable. This can be overridden with - . + systemd reads the log level from this environment variable. This can be overridden + with . $SYSTEMD_LOG_LOCATION - Controls whether systemd prints the code - location along with log messages. This can be overridden with - . + Controls whether systemd prints the code location along with log messages. This can + be overridden with . $SYSTEMD_LOG_TARGET - systemd reads the log target from this - environment variable. This can be overridden with - . + systemd reads the log target from this environment variable. This can be overridden + with . $SYSTEMD_LOG_TIME - Controls whether systemd prefixes log - messages with the current time. This can be overridden with - . + Controls whether systemd prefixes log messages with the current time. This can be + overridden with . + + + + $SYSTEMD_LOG_TID + Controls whether systemd prefixes log messages with the current thread ID + (TID). @@ -845,16 +846,15 @@ systemd.log_location systemd.log_target= systemd.log_time + systemd.log_tid Controls log output, with the same effect as the - $SYSTEMD_LOG_COLOR, - $SYSTEMD_LOG_LEVEL, - $SYSTEMD_LOG_LOCATION, - $SYSTEMD_LOG_TARGET, - $SYSTEMD_LOG_TIME, environment variables described above. - systemd.log_color, systemd.log_location, and - systemd.log_time can be specified without an argument, with the - same effect as a positive boolean. + $SYSTEMD_LOG_COLOR, $SYSTEMD_LOG_LEVEL, + $SYSTEMD_LOG_LOCATION, $SYSTEMD_LOG_TARGET, + $SYSTEMD_LOG_TIME, $SYSTEMD_LOG_TID environment variables + described above. systemd.log_color, systemd.log_location, + systemd.log_time and systemd.log_tid= can be specified without + an argument, with the same effect as a positive boolean. diff --git a/src/basic/log.c b/src/basic/log.c index 899a8423f22..89d26a4a438 100644 --- a/src/basic/log.c +++ b/src/basic/log.c @@ -22,6 +22,7 @@ #include "io-util.h" #include "log.h" #include "macro.h" +#include "missing_syscall.h" #include "parse-util.h" #include "proc-cmdline.h" #include "process-util.h" @@ -53,6 +54,7 @@ static bool syslog_is_stream = false; static bool show_color = false; static bool show_location = false; static bool show_time = false; +static bool show_tid = false; static bool upgrade_syslog_to_journal = false; static bool always_reopen_console = false; @@ -360,8 +362,9 @@ static int write_to_console( char location[256], header_time[FORMAT_TIMESTAMP_MAX], - prefix[1 + DECIMAL_STR_MAX(int) + 2]; - struct iovec iovec[8] = {}; + prefix[1 + DECIMAL_STR_MAX(int) + 2], + tid_string[3 + DECIMAL_STR_MAX(pid_t) + 1]; + struct iovec iovec[9]; const char *on = NULL, *off = NULL; size_t n = 0; @@ -380,6 +383,11 @@ static int write_to_console( } } + if (show_tid) { + xsprintf(tid_string, "(" PID_FMT ") ", gettid()); + iovec[n++] = IOVEC_MAKE_STRING(tid_string); + } + if (show_color) get_log_colors(LOG_PRI(level), &on, &off, NULL); @@ -1133,6 +1141,11 @@ static int parse_proc_cmdline_item(const char *key, const char *value, void *dat if (log_show_location_from_string(value ?: "1") < 0) log_warning("Failed to parse log location setting '%s'. Ignoring.", value); + } else if (proc_cmdline_key_streq(key, "systemd.log_tid")) { + + if (log_show_tid_from_string(value ?: "1") < 0) + log_warning("Failed to parse log tid setting '%s'. Ignoring.", value); + } else if (proc_cmdline_key_streq(key, "systemd.log_time")) { if (log_show_time_from_string(value ?: "1") < 0) @@ -1177,6 +1190,10 @@ void log_parse_environment_cli_realm(LogRealm realm) { e = getenv("SYSTEMD_LOG_TIME"); if (e && log_show_time_from_string(e) < 0) log_warning("Failed to parse log time '%s'. Ignoring.", e); + + e = getenv("SYSTEMD_LOG_TID"); + if (e && log_show_tid_from_string(e) < 0) + log_warning("Failed to parse log tid '%s'. Ignoring.", e); } LogTarget log_get_target(void) { @@ -1211,6 +1228,14 @@ bool log_get_show_time(void) { return show_time; } +void log_show_tid(bool b) { + show_tid = b; +} + +bool log_get_show_tid(void) { + return show_tid; +} + int log_show_color_from_string(const char *e) { int t; @@ -1244,6 +1269,17 @@ int log_show_time_from_string(const char *e) { return 0; } +int log_show_tid_from_string(const char *e) { + int t; + + t = parse_boolean(e); + if (t < 0) + return t; + + log_show_tid(t); + return 0; +} + bool log_on_console(void) { if (IN_SET(log_target, LOG_TARGET_CONSOLE, LOG_TARGET_CONSOLE_PREFIXED)) diff --git a/src/basic/log.h b/src/basic/log.h index 137d21005d4..c65419b6998 100644 --- a/src/basic/log.h +++ b/src/basic/log.h @@ -61,10 +61,13 @@ void log_show_location(bool b); bool log_get_show_location(void) _pure_; void log_show_time(bool b); bool log_get_show_time(void) _pure_; +void log_show_tid(bool b); +bool log_get_show_tid(void) _pure_; int log_show_color_from_string(const char *e); int log_show_location_from_string(const char *e); int log_show_time_from_string(const char *e); +int log_show_tid_from_string(const char *e); LogTarget log_get_target(void) _pure_; int log_get_max_level_realm(LogRealm realm) _pure_;