diff --git a/man/systemd.journal-fields.xml b/man/systemd.journal-fields.xml
index 197a468f25..31e3d8b210 100644
--- a/man/systemd.journal-fields.xml
+++ b/man/systemd.journal-fields.xml
@@ -149,6 +149,13 @@
file:/, man: or info: URL.
+
+
+ TID=
+
+ The numeric thread ID (TID) the log message originates from.
+
+
diff --git a/man/systemd.xml b/man/systemd.xml
index 501faf266d..d53b52b6b7 100644
--- a/man/systemd.xml
+++ b/man/systemd.xml
@@ -613,37 +613,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).
@@ -844,16 +845,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 899a8423f2..7c68258ea8 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);
@@ -539,6 +547,7 @@ static int log_do_header(
r = snprintf(header, size,
"PRIORITY=%i\n"
"SYSLOG_FACILITY=%i\n"
+ "TID=" PID_FMT "\n"
"%s%.256s%s" /* CODE_FILE */
"%s%.*i%s" /* CODE_LINE */
"%s%.256s%s" /* CODE_FUNC */
@@ -548,6 +557,7 @@ static int log_do_header(
"SYSLOG_IDENTIFIER=%.256s\n",
LOG_PRI(level),
LOG_FAC(level),
+ gettid(),
isempty(file) ? "" : "CODE_FILE=",
isempty(file) ? "" : file,
isempty(file) ? "" : "\n",
@@ -1133,6 +1143,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 +1192,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 +1230,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 +1271,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 137d21005d..c65419b699 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_;