Zbigniew Jędrzejewski-Szmek 930e1b
From d787844df7f23a079c8bab893a8412550848bb6a Mon Sep 17 00:00:00 2001
Zbigniew Jędrzejewski-Szmek 930e1b
From: Umut Tezduyar Lindskog <umut.tezduyar@axis.com>
Zbigniew Jędrzejewski-Szmek 930e1b
Date: Wed, 13 Nov 2013 15:27:19 +0100
Zbigniew Jędrzejewski-Szmek 930e1b
Subject: [PATCH] journal: timestamp support on console messages
Zbigniew Jędrzejewski-Szmek 930e1b
Zbigniew Jędrzejewski-Szmek 930e1b
journald mimics the kernel here: timestamps will be printed if
Zbigniew Jędrzejewski-Szmek 930e1b
/sys/module/printk/parameters/time contains "Y".
Zbigniew Jędrzejewski-Szmek 930e1b
---
Zbigniew Jędrzejewski-Szmek 930e1b
 src/journal/journald-console.c | 34 +++++++++++++++++++++++++++++++---
Zbigniew Jędrzejewski-Szmek 930e1b
 1 file changed, 31 insertions(+), 3 deletions(-)
Zbigniew Jędrzejewski-Szmek 930e1b
Zbigniew Jędrzejewski-Szmek 930e1b
diff --git a/src/journal/journald-console.c b/src/journal/journald-console.c
Zbigniew Jędrzejewski-Szmek 930e1b
index be55f94..1ee3afe 100644
Zbigniew Jędrzejewski-Szmek 930e1b
--- a/src/journal/journald-console.c
Zbigniew Jędrzejewski-Szmek 930e1b
+++ b/src/journal/journald-console.c
Zbigniew Jędrzejewski-Szmek 930e1b
@@ -19,13 +19,30 @@
Zbigniew Jędrzejewski-Szmek 930e1b
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
Zbigniew Jędrzejewski-Szmek 930e1b
 ***/
Zbigniew Jędrzejewski-Szmek 930e1b
 
Zbigniew Jędrzejewski-Szmek 930e1b
+#include <time.h>
Zbigniew Jędrzejewski-Szmek 930e1b
 #include <fcntl.h>
Zbigniew Jędrzejewski-Szmek 930e1b
 #include <unistd.h>
Zbigniew Jędrzejewski-Szmek 930e1b
 #include <sys/socket.h>
Zbigniew Jędrzejewski-Szmek 930e1b
 
Zbigniew Jędrzejewski-Szmek 930e1b
+#include "fileio.h"
Zbigniew Jędrzejewski-Szmek 930e1b
 #include "journald-server.h"
Zbigniew Jędrzejewski-Szmek 930e1b
 #include "journald-console.h"
Zbigniew Jędrzejewski-Szmek 930e1b
 
Zbigniew Jędrzejewski-Szmek 930e1b
+static bool prefix_timestamp(void) {
Zbigniew Jędrzejewski-Szmek 930e1b
+
Zbigniew Jędrzejewski-Szmek 930e1b
+        static int cached_printk_time = -1;
Zbigniew Jędrzejewski-Szmek 930e1b
+
Zbigniew Jędrzejewski-Szmek 930e1b
+        if (_unlikely_(cached_printk_time < 0)) {
Zbigniew Jędrzejewski-Szmek 930e1b
+                _cleanup_free_ char *p = NULL;
Zbigniew Jędrzejewski-Szmek 930e1b
+
Zbigniew Jędrzejewski-Szmek 930e1b
+                cached_printk_time =
Zbigniew Jędrzejewski-Szmek 930e1b
+                        read_one_line_file("/sys/module/printk/parameters/time", &p) >= 0
Zbigniew Jędrzejewski-Szmek 930e1b
+                        && parse_boolean(p) > 0;
Zbigniew Jędrzejewski-Szmek 930e1b
+        }
Zbigniew Jędrzejewski-Szmek 930e1b
+
Zbigniew Jędrzejewski-Szmek 930e1b
+        return cached_printk_time;
Zbigniew Jędrzejewski-Szmek 930e1b
+}
Zbigniew Jędrzejewski-Szmek 930e1b
+
Zbigniew Jędrzejewski-Szmek 930e1b
 void server_forward_console(
Zbigniew Jędrzejewski-Szmek 930e1b
                 Server *s,
Zbigniew Jędrzejewski-Szmek 930e1b
                 int priority,
Zbigniew Jędrzejewski-Szmek 930e1b
@@ -33,8 +50,10 @@ void server_forward_console(
Zbigniew Jędrzejewski-Szmek 930e1b
                 const char *message,
Zbigniew Jędrzejewski-Szmek 930e1b
                 struct ucred *ucred) {
Zbigniew Jędrzejewski-Szmek 930e1b
 
Zbigniew Jędrzejewski-Szmek 930e1b
-        struct iovec iovec[4];
Zbigniew Jędrzejewski-Szmek 930e1b
+        struct iovec iovec[5];
Zbigniew Jędrzejewski-Szmek 930e1b
         char header_pid[16];
Zbigniew Jędrzejewski-Szmek 930e1b
+        struct timespec ts;
Zbigniew Jędrzejewski-Szmek 930e1b
+        char tbuf[4 + DECIMAL_STR_MAX(ts.tv_sec) + DECIMAL_STR_MAX(ts.tv_nsec)-3 + 1];
Zbigniew Jędrzejewski-Szmek 930e1b
         int n = 0, fd;
Zbigniew Jędrzejewski-Szmek 930e1b
         char *ident_buf = NULL;
Zbigniew Jędrzejewski-Szmek 930e1b
         const char *tty;
Zbigniew Jędrzejewski-Szmek 930e1b
@@ -45,7 +64,16 @@ void server_forward_console(
Zbigniew Jędrzejewski-Szmek 930e1b
         if (LOG_PRI(priority) > s->max_level_console)
Zbigniew Jędrzejewski-Szmek 930e1b
                 return;
Zbigniew Jędrzejewski-Szmek 930e1b
 
Zbigniew Jędrzejewski-Szmek 930e1b
-        /* First: identifier and PID */
Zbigniew Jędrzejewski-Szmek 930e1b
+        /* First: timestamp */
Zbigniew Jędrzejewski-Szmek 930e1b
+        if (prefix_timestamp()) {
Zbigniew Jędrzejewski-Szmek 930e1b
+                assert_se(clock_gettime(CLOCK_MONOTONIC, &ts) == 0);
Zbigniew Jędrzejewski-Szmek 930e1b
+                snprintf(tbuf, sizeof(tbuf), "[%5llu.%06llu] ",
Zbigniew Jędrzejewski-Szmek 930e1b
+                         (unsigned long long) ts.tv_sec,
Zbigniew Jędrzejewski-Szmek 930e1b
+                         (unsigned long long) ts.tv_nsec / 1000);
Zbigniew Jędrzejewski-Szmek 930e1b
+                IOVEC_SET_STRING(iovec[n++], tbuf);
Zbigniew Jędrzejewski-Szmek 930e1b
+        }
Zbigniew Jędrzejewski-Szmek 930e1b
+
Zbigniew Jędrzejewski-Szmek 930e1b
+        /* Second: identifier and PID */
Zbigniew Jędrzejewski-Szmek 930e1b
         if (ucred) {
Zbigniew Jędrzejewski-Szmek 930e1b
                 if (!identifier) {
Zbigniew Jędrzejewski-Szmek 930e1b
                         get_process_comm(ucred->pid, &ident_buf);
Zbigniew Jędrzejewski-Szmek 930e1b
@@ -64,7 +92,7 @@ void server_forward_console(
Zbigniew Jędrzejewski-Szmek 930e1b
                 IOVEC_SET_STRING(iovec[n++], ": ");
Zbigniew Jędrzejewski-Szmek 930e1b
         }
Zbigniew Jędrzejewski-Szmek 930e1b
 
Zbigniew Jędrzejewski-Szmek 930e1b
-        /* Third: message */
Zbigniew Jędrzejewski-Szmek 930e1b
+        /* Fourth: message */
Zbigniew Jędrzejewski-Szmek 930e1b
         IOVEC_SET_STRING(iovec[n++], message);
Zbigniew Jędrzejewski-Szmek 930e1b
         IOVEC_SET_STRING(iovec[n++], "\n");
Zbigniew Jędrzejewski-Szmek 930e1b