chiark / gitweb /
journalctl: add new short-monotonic output mode
[elogind.git] / src / logs-show.c
index decb89b6dfe50428439fdab5bce74eaa47323a6b..58d1e99dfa18fe947efd7c97b066ad53d0f6d54d 100644 (file)
@@ -84,12 +84,8 @@ static bool shall_print(bool show_all, char *p, size_t l) {
         return true;
 }
 
-static int output_short(sd_journal *j, unsigned line, bool show_all) {
+static int output_short(sd_journal *j, unsigned line, bool show_all, bool monotonic) {
         int r;
-        uint64_t realtime;
-        time_t t;
-        struct tm tm;
-        char buf[64];
         const void *data;
         size_t length;
         size_t n = 0;
@@ -140,20 +136,39 @@ static int output_short(sd_journal *j, unsigned line, bool show_all) {
                 goto finish;
         }
 
-        r = sd_journal_get_realtime_usec(j, &realtime);
-        if (r < 0) {
-                log_error("Failed to get realtime: %s", strerror(-r));
-                goto finish;
-        }
+        if (monotonic) {
+                uint64_t t;
 
-        t = (time_t) (realtime / USEC_PER_SEC);
-        if (strftime(buf, sizeof(buf), "%b %d %H:%M:%S", localtime_r(&t, &tm)) <= 0) {
-                log_error("Failed to format time.");
-                goto finish;
-        }
+                r = sd_journal_get_monotonic_usec(j, &t, NULL);
+                if (r >= 0) {
+                        printf("[%5llu.%06llu]",
+                               (unsigned long long) (t / USEC_PER_SEC),
+                               (unsigned long long) (t % USEC_PER_SEC));
 
-        fputs(buf, stdout);
-        n += strlen(buf);
+                        n += 1 + 5 + 1 + 6 + 1;
+                }
+
+        } else {
+                char buf[64];
+                uint64_t realtime;
+                time_t t;
+                struct tm tm;
+
+                r = sd_journal_get_realtime_usec(j, &realtime);
+                if (r < 0) {
+                        log_error("Failed to get realtime: %s", strerror(-r));
+                        goto finish;
+                }
+
+                t = (time_t) (realtime / USEC_PER_SEC);
+                if (strftime(buf, sizeof(buf), "%b %d %H:%M:%S", localtime_r(&t, &tm)) <= 0) {
+                        log_error("Failed to format time.");
+                        goto finish;
+                }
+
+                fputs(buf, stdout);
+                n += strlen(buf);
+        }
 
         if (hostname && shall_print(show_all, hostname, hostname_len)) {
                 printf(" %.*s", (int) hostname_len, hostname);
@@ -209,6 +224,14 @@ finish:
         return r;
 }
 
+static int output_short_realtime(sd_journal *j, unsigned line, bool show_all) {
+        return output_short(j, line, show_all, false);
+}
+
+static int output_short_monotonic(sd_journal *j, unsigned line, bool show_all) {
+        return output_short(j, line, show_all, true);
+}
+
 static int output_verbose(sd_journal *j, unsigned line, bool show_all) {
         const void *data;
         size_t length;
@@ -432,7 +455,8 @@ static int output_json(sd_journal *j, unsigned line, bool show_all) {
 }
 
 static int (*output_funcs[_OUTPUT_MODE_MAX])(sd_journal*j, unsigned line, bool show_all) = {
-        [OUTPUT_SHORT] = output_short,
+        [OUTPUT_SHORT] = output_short_realtime,
+        [OUTPUT_SHORT_MONOTONIC] = output_short_monotonic,
         [OUTPUT_VERBOSE] = output_verbose,
         [OUTPUT_EXPORT] = output_export,
         [OUTPUT_JSON] = output_json
@@ -575,6 +599,7 @@ finish:
 
 static const char *const output_mode_table[_OUTPUT_MODE_MAX] = {
         [OUTPUT_SHORT] = "short",
+        [OUTPUT_SHORT_MONOTONIC] = "short-monotonic",
         [OUTPUT_VERBOSE] = "verbose",
         [OUTPUT_EXPORT] = "export",
         [OUTPUT_JSON] = "json"