From 67a122058b077efaed3b07706e91761e09de4f59 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Sat, 7 Jan 2012 04:41:30 +0100 Subject: [PATCH] journalctl: add new short-monotonic output mode --- src/journal/journalctl.c | 2 +- src/logs-show.c | 61 ++++++++++++++++++++++++++++------------ src/logs-show.h | 1 + src/systemctl.c | 2 +- 4 files changed, 46 insertions(+), 20 deletions(-) diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c index 393601c77..910259f73 100644 --- a/src/journal/journalctl.c +++ b/src/journal/journalctl.c @@ -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); diff --git a/src/logs-show.c b/src/logs-show.c index decb89b6d..58d1e99df 100644 --- a/src/logs-show.c +++ b/src/logs-show.c @@ -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" diff --git a/src/logs-show.h b/src/logs-show.h index d3f3c7596..2158a44ce 100644 --- a/src/logs-show.h +++ b/src/logs-show.h @@ -30,6 +30,7 @@ typedef enum OutputMode { OUTPUT_SHORT, + OUTPUT_SHORT_MONOTONIC, OUTPUT_VERBOSE, OUTPUT_EXPORT, OUTPUT_JSON, diff --git a/src/systemctl.c b/src/systemctl.c index 9b915f65d..dfdbd1d63 100644 --- a/src/systemctl.c +++ b/src/systemctl.c @@ -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" -- 2.30.2