]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
log: optionally display thread ID in log output to tty
authorLennart Poettering <lennart@poettering.net>
Tue, 29 Sep 2020 11:06:12 +0000 (13:06 +0200)
committerLennart Poettering <lennart@poettering.net>
Tue, 29 Sep 2020 13:51:53 +0000 (15:51 +0200)
This is very useful when playing around with threaded tests, but should
be useful in other cases too.

man/systemd.xml
src/basic/log.c
src/basic/log.h

index a9040545c2ab6181998ba781912a86c550b5ca6a..5e7dc5be732ec25691d777f6261c70d4bab31028 100644 (file)
     <variablelist class='environment-variables'>
       <varlistentry>
         <term><varname>$SYSTEMD_LOG_COLOR</varname></term>
-        <listitem><para>Controls whether systemd highlights important
-        log messages. This can be overridden with
-        <option>--log-color</option>.</para></listitem>
+        <listitem><para>Controls whether systemd highlights important log messages. This can be overridden
+        with <option>--log-color=</option>.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         <term><varname>$SYSTEMD_LOG_LEVEL</varname></term>
-        <listitem><para>systemd reads the log level from this
-        environment variable. This can be overridden with
-        <option>--log-level=</option>.</para></listitem>
+        <listitem><para>systemd reads the log level from this environment variable. This can be overridden
+        with <option>--log-level=</option>.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         <term><varname>$SYSTEMD_LOG_LOCATION</varname></term>
-        <listitem><para>Controls whether systemd prints the code
-        location along with log messages. This can be overridden with
-        <option>--log-location</option>.</para></listitem>
+        <listitem><para>Controls whether systemd prints the code location along with log messages. This can
+        be overridden with <option>--log-location=</option>.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         <term><varname>$SYSTEMD_LOG_TARGET</varname></term>
-        <listitem><para>systemd reads the log target from this
-        environment variable. This can be overridden with
-        <option>--log-target=</option>.</para></listitem>
+        <listitem><para>systemd reads the log target from this environment variable. This can be overridden
+        with <option>--log-target=</option>.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         <term><varname>$SYSTEMD_LOG_TIME</varname></term>
-        <listitem><para>Controls whether systemd prefixes log
-        messages with the current time. This can be overridden with
-        <option>--log-time=</option>.</para></listitem>
+        <listitem><para>Controls whether systemd prefixes log messages with the current time. This can be
+        overridden with <option>--log-time=</option>.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><varname>$SYSTEMD_LOG_TID</varname></term>
+        <listitem><para>Controls whether systemd prefixes log messages with the current thread ID
+        (TID).</para></listitem>
       </varlistentry>
 
       <varlistentry>
         <term><varname>systemd.log_location</varname></term>
         <term><varname>systemd.log_target=</varname></term>
         <term><varname>systemd.log_time</varname></term>
+        <term><varname>systemd.log_tid</varname></term>
 
         <listitem><para>Controls log output, with the same effect as the
-        <varname>$SYSTEMD_LOG_COLOR</varname>,
-        <varname>$SYSTEMD_LOG_LEVEL</varname>,
-        <varname>$SYSTEMD_LOG_LOCATION</varname>,
-        <varname>$SYSTEMD_LOG_TARGET</varname>,
-        <varname>$SYSTEMD_LOG_TIME</varname>, environment variables described above.
-        <varname>systemd.log_color</varname>, <varname>systemd.log_location</varname>, and
-        <varname>systemd.log_time</varname> can be specified without an argument, with the
-        same effect as a positive boolean.</para></listitem>
+        <varname>$SYSTEMD_LOG_COLOR</varname>, <varname>$SYSTEMD_LOG_LEVEL</varname>,
+        <varname>$SYSTEMD_LOG_LOCATION</varname>, <varname>$SYSTEMD_LOG_TARGET</varname>,
+        <varname>$SYSTEMD_LOG_TIME</varname>, <varname>$SYSTEMD_LOG_TID</varname> environment variables
+        described above.  <varname>systemd.log_color</varname>, <varname>systemd.log_location</varname>,
+        <varname>systemd.log_time</varname> and <varname>systemd.log_tid=</varname> can be specified without
+        an argument, with the same effect as a positive boolean.</para></listitem>
       </varlistentry>
 
       <varlistentry>
index 899a8423f22d6eea59d84e2ca04a34a857b3ff6a..89d26a4a438dbf90117ce5d7296c1ac3483644ad 100644 (file)
@@ -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))
index 137d21005d415f32a3d33f146d7ad9addac7102f..c65419b69981a65c264cf3b3ff1d87355df95faa 100644 (file)
@@ -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_;