chiark / gitweb /
journalctl: add new short-monotonic output mode
authorLennart Poettering <lennart@poettering.net>
Sat, 7 Jan 2012 03:41:30 +0000 (04:41 +0100)
committerLennart Poettering <lennart@poettering.net>
Sat, 7 Jan 2012 03:41:30 +0000 (04:41 +0100)
src/journal/journalctl.c
src/logs-show.c
src/logs-show.h
src/systemctl.c

index 393601c..910259f 100644 (file)
@@ -57,7 +57,7 @@ static int help(void) {
                "  -f --follow         Follow journal\n"
                "  -n --lines=INTEGER  Journal entries to show\n"
                "     --no-tail        Show all lines, even in follow mode\n"
-               "  -o --output=STRING  Change journal output mode (short, verbose, export, json)\n"
+               "  -o --output=STRING  Change journal output mode (short, short-verbose, verbose, export, json)\n"
                "     --new-id128      Generate a new 128 Bit id\n",
                program_invocation_short_name);
 
index decb89b..58d1e99 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"
index d3f3c75..2158a44 100644 (file)
@@ -30,6 +30,7 @@
 
 typedef enum OutputMode {
         OUTPUT_SHORT,
+        OUTPUT_SHORT_MONOTONIC,
         OUTPUT_VERBOSE,
         OUTPUT_EXPORT,
         OUTPUT_JSON,
index 9b915f6..dfdbd1d 100644 (file)
@@ -3979,7 +3979,7 @@ static int systemctl_help(void) {
                "     --runtime        Enable unit files only temporarily until next reboot\n"
                "  -n --lines=INTEGER  Journal entries to show\n"
                "     --follow         Follow journal\n"
-               "  -o --output=STRING  Change journal output mode (short, verbose, export, json)\n\n"
+               "  -o --output=STRING  Change journal output mode (short, short-monotonic, verbose, export, json)\n\n"
                "Unit Commands:\n"
                "  list-units                      List loaded units\n"
                "  start [NAME...]                 Start (activate) one or more units\n"