]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
log: add support for prefixing console log messages with current timestamp 13084/head
authorDan Streetman <ddstreet@canonical.com>
Mon, 15 Jul 2019 13:56:24 +0000 (09:56 -0400)
committerDan Streetman <ddstreet@canonical.com>
Mon, 10 Feb 2020 12:01:30 +0000 (07:01 -0500)
man/systemd-socket-activate.xml
man/systemd-system.conf.xml
man/systemd.xml
src/basic/log.c
src/basic/log.h
src/core/main.c
src/core/system.conf.in
src/core/user.conf.in
src/shutdown/shutdown.c

index f3dbb47a61728dfc82d47de8e1d492a932451dac..20a557219257d5db8ff9165a2a902fe5c3ecfdb0 100644 (file)
       <varlistentry>
         <term><varname>$SYSTEMD_LOG_TARGET</varname></term>
         <term><varname>$SYSTEMD_LOG_LEVEL</varname></term>
+        <term><varname>$SYSTEMD_LOG_TIME</varname></term>
         <term><varname>$SYSTEMD_LOG_COLOR</varname></term>
         <term><varname>$SYSTEMD_LOG_LOCATION</varname></term>
 
index 3e6742ce2c913c2ec062953f11062da08e00920d..435c3882dbeb4b1e58eb1a71f6e31329f5e86e91 100644 (file)
@@ -67,6 +67,7 @@
         <term><varname>LogLevel=</varname></term>
         <term><varname>LogLocation=</varname></term>
         <term><varname>LogTarget=</varname></term>
+        <term><varname>LogTime=</varname></term>
         <term><varname>DumpCore=yes</varname></term>
         <term><varname>CrashChangeVT=no</varname></term>
         <term><varname>CrashShell=no</varname></term>
index 16f896a9eb0fdacde0c2e8749eb37ea6e7888009..92d2708e4f7a5ceb414d45a4a2ffdc15b68c5112 100644 (file)
         <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>
+      </varlistentry>
+
       <varlistentry>
         <term><varname>$XDG_CONFIG_HOME</varname></term>
         <term><varname>$XDG_CONFIG_DIRS</varname></term>
         <term><varname>systemd.log_level=</varname></term>
         <term><varname>systemd.log_location</varname></term>
         <term><varname>systemd.log_target=</varname></term>
+        <term><varname>systemd.log_time</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>, environment variables described above.
-        <varname>systemd.log_color</varname> and <varname>systemd.log_location</varname> can be
-        specified without an argument, with the same effect as a positive boolean.</para></listitem>
+        <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>
       </varlistentry>
 
       <varlistentry>
           <listitem><para>Set log target. See <varname>systemd.log_target</varname> above.</para></listitem>
         </varlistentry>
 
+        <varlistentry>
+          <term><option>--log-time=</option></term>
+
+          <listitem><para>Prefix messages with timestamp. See <varname>systemd.log_time</varname> above.
+          </para></listitem>
+        </varlistentry>
+
         <varlistentry>
           <term><option>--machine-id=</option></term>
 
index 17557e1844b2a0e9fecf94d9b8ebd06257b4d843..ca024d970e6bec9256d8ea687cd32693504417ef 100644 (file)
@@ -51,6 +51,7 @@ static bool syslog_is_stream = false;
 
 static bool show_color = false;
 static bool show_location = false;
+static bool show_time = false;
 
 static bool upgrade_syslog_to_journal = false;
 static bool always_reopen_console = false;
@@ -332,8 +333,10 @@ static int write_to_console(
                 const char *func,
                 const char *buffer) {
 
-        char location[256], prefix[1 + DECIMAL_STR_MAX(int) + 2];
-        struct iovec iovec[6] = {};
+        char location[256],
+             header_time[FORMAT_TIMESTAMP_MAX],
+             prefix[1 + DECIMAL_STR_MAX(int) + 2];
+        struct iovec iovec[8] = {};
         const char *on = NULL, *off = NULL;
         size_t n = 0;
 
@@ -345,6 +348,13 @@ static int write_to_console(
                 iovec[n++] = IOVEC_MAKE_STRING(prefix);
         }
 
+        if (show_time) {
+                if (format_timestamp(header_time, sizeof(header_time), now(CLOCK_REALTIME))) {
+                        iovec[n++] = IOVEC_MAKE_STRING(header_time);
+                        iovec[n++] = IOVEC_MAKE_STRING(" ");
+                }
+        }
+
         if (show_color)
                 get_log_colors(LOG_PRI(level), &on, &off, NULL);
 
@@ -1099,6 +1109,12 @@ 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_time")) {
+
+                if (log_show_time_from_string(value ?: "1") < 0)
+                        log_warning("Failed to parse log time setting '%s'. Ignoring.", value);
+
         }
 
         return 0;
@@ -1130,6 +1146,10 @@ void log_parse_environment_realm(LogRealm realm) {
         e = getenv("SYSTEMD_LOG_LOCATION");
         if (e && log_show_location_from_string(e) < 0)
                 log_warning("Failed to parse log location '%s'. Ignoring.", e);
+
+        e = getenv("SYSTEMD_LOG_TIME");
+        if (e && log_show_time_from_string(e) < 0)
+                log_warning("Failed to parse log time '%s'. Ignoring.", e);
 }
 
 LogTarget log_get_target(void) {
@@ -1156,6 +1176,14 @@ bool log_get_show_location(void) {
         return show_location;
 }
 
+void log_show_time(bool b) {
+        show_time = b;
+}
+
+bool log_get_show_time(void) {
+        return show_time;
+}
+
 int log_show_color_from_string(const char *e) {
         int t;
 
@@ -1178,6 +1206,17 @@ int log_show_location_from_string(const char *e) {
         return 0;
 }
 
+int log_show_time_from_string(const char *e) {
+        int t;
+
+        t = parse_boolean(e);
+        if (t < 0)
+                return t;
+
+        log_show_time(t);
+        return 0;
+}
+
 bool log_on_console(void) {
         if (IN_SET(log_target, LOG_TARGET_CONSOLE,
                                LOG_TARGET_CONSOLE_PREFIXED))
index 625be22402b146603b5583a365c014a6a8efa8cc..4cec988364ff1023fabd86815c190d11e7a480a3 100644 (file)
@@ -59,9 +59,12 @@ void log_show_color(bool b);
 bool log_get_show_color(void) _pure_;
 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_;
 
 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);
 
 LogTarget log_get_target(void) _pure_;
 int log_get_max_level_realm(LogRealm realm) _pure_;
index 23a8ada1ec799b8d024154fdc8103bb48a77be38..fa91c6d81dca4fa330912fdd5651db79cb268189 100644 (file)
@@ -545,8 +545,9 @@ static int parse_proc_cmdline_item(const char *key, const char *value, void *dat
 
 DEFINE_SETTER(config_parse_level2, log_set_max_level_from_string, "log level");
 DEFINE_SETTER(config_parse_target, log_set_target_from_string, "target");
-DEFINE_SETTER(config_parse_color, log_show_color_from_string, "color" );
+DEFINE_SETTER(config_parse_color, log_show_color_from_string, "color");
 DEFINE_SETTER(config_parse_location, log_show_location_from_string, "location");
+DEFINE_SETTER(config_parse_time, log_show_time_from_string, "time");
 
 static int config_parse_default_timeout_abort(
                 const char *unit,
@@ -574,6 +575,7 @@ static int parse_config_file(void) {
                 { "Manager", "LogTarget",                    config_parse_target,                0, NULL                                   },
                 { "Manager", "LogColor",                     config_parse_color,                 0, NULL                                   },
                 { "Manager", "LogLocation",                  config_parse_location,              0, NULL                                   },
+                { "Manager", "LogTime",                      config_parse_time,                  0, NULL                                   },
                 { "Manager", "DumpCore",                     config_parse_bool,                  0, &arg_dump_core                         },
                 { "Manager", "CrashChVT", /* legacy */       config_parse_crash_chvt,            0, &arg_crash_chvt                        },
                 { "Manager", "CrashChangeVT",                config_parse_crash_chvt,            0, &arg_crash_chvt                        },
@@ -721,6 +723,7 @@ static int parse_argv(int argc, char *argv[]) {
                 ARG_LOG_TARGET,
                 ARG_LOG_COLOR,
                 ARG_LOG_LOCATION,
+                ARG_LOG_TIME,
                 ARG_UNIT,
                 ARG_SYSTEM,
                 ARG_USER,
@@ -748,6 +751,7 @@ static int parse_argv(int argc, char *argv[]) {
                 { "log-target",               required_argument, NULL, ARG_LOG_TARGET               },
                 { "log-color",                optional_argument, NULL, ARG_LOG_COLOR                },
                 { "log-location",             optional_argument, NULL, ARG_LOG_LOCATION             },
+                { "log-time",                 optional_argument, NULL, ARG_LOG_TIME                 },
                 { "unit",                     required_argument, NULL, ARG_UNIT                     },
                 { "system",                   no_argument,       NULL, ARG_SYSTEM                   },
                 { "user",                     no_argument,       NULL, ARG_USER                     },
@@ -821,6 +825,18 @@ static int parse_argv(int argc, char *argv[]) {
 
                         break;
 
+                case ARG_LOG_TIME:
+
+                        if (optarg) {
+                                r = log_show_time_from_string(optarg);
+                                if (r < 0)
+                                        return log_error_errno(r, "Failed to parse log time setting \"%s\": %m",
+                                                               optarg);
+                        } else
+                                log_show_time(true);
+
+                        break;
+
                 case ARG_DEFAULT_STD_OUTPUT:
                         r = exec_output_from_string(optarg);
                         if (r < 0)
@@ -1042,6 +1058,7 @@ static int help(void) {
                "     --log-level=LEVEL           Set log level (debug, info, notice, warning, err, crit, alert, emerg)\n"
                "     --log-color[=BOOL]          Highlight important log messages\n"
                "     --log-location[=BOOL]       Include code location in log messages\n"
+               "     --log-time[=BOOL]           Prefix log messages with current time\n"
                "     --default-standard-output=  Set default standard output for services\n"
                "     --default-standard-error=   Set default standard error output for services\n"
                "\nSee the %s for details.\n"
@@ -1424,6 +1441,9 @@ static int become_shutdown(
         if (log_get_show_location())
                 command_line[pos++] = "--log-location";
 
+        if (log_get_show_time())
+                command_line[pos++] = "--log-time";
+
         if (streq(shutdown_verb, "exit")) {
                 command_line[pos++] = "--exit-code";
                 command_line[pos++] = exit_code;
index 8112125468a5b9d411ed7e0447bb3b35f3e7e70a..40bb548887110bb967038e5546661fc725be2071 100644 (file)
@@ -16,6 +16,7 @@
 #LogTarget=journal-or-kmsg
 #LogColor=yes
 #LogLocation=no
+#LogTime=no
 #DumpCore=yes
 #ShowStatus=yes
 #CrashChangeVT=no
index 95a162e0f6cc0d33f873c6f2fb947980af378e36..bbe06319c9acfd73d77e5a0e317848c1ec405baf 100644 (file)
@@ -15,6 +15,7 @@
 #LogTarget=console
 #LogColor=yes
 #LogLocation=no
+#LogTime=no
 #SystemCallArchitectures=
 #TimerSlackNSec=
 #StatusUnitFormat=@STATUS_UNIT_FORMAT_DEFAULT@
index 15e6c1799e71451ad846ed16f0af7e79c464257b..c405ab9744831e891453db7dbfaf587be5631fc4 100644 (file)
@@ -51,6 +51,7 @@ static int parse_argv(int argc, char *argv[]) {
                 ARG_LOG_TARGET,
                 ARG_LOG_COLOR,
                 ARG_LOG_LOCATION,
+                ARG_LOG_TIME,
                 ARG_EXIT_CODE,
                 ARG_TIMEOUT,
         };
@@ -60,6 +61,7 @@ static int parse_argv(int argc, char *argv[]) {
                 { "log-target",    required_argument, NULL, ARG_LOG_TARGET   },
                 { "log-color",     optional_argument, NULL, ARG_LOG_COLOR    },
                 { "log-location",  optional_argument, NULL, ARG_LOG_LOCATION },
+                { "log-time",      optional_argument, NULL, ARG_LOG_TIME     },
                 { "exit-code",     required_argument, NULL, ARG_EXIT_CODE    },
                 { "timeout",       required_argument, NULL, ARG_TIMEOUT      },
                 {}
@@ -110,6 +112,17 @@ static int parse_argv(int argc, char *argv[]) {
 
                         break;
 
+                case ARG_LOG_TIME:
+
+                        if (optarg) {
+                                r = log_show_time_from_string(optarg);
+                                if (r < 0)
+                                        log_error_errno(r, "Failed to parse log time setting %s, ignoring: %m", optarg);
+                        } else
+                                log_show_time(true);
+
+                        break;
+
                 case ARG_EXIT_CODE:
                         r = safe_atou8(optarg, &arg_exit_code);
                         if (r < 0)