From: Zbigniew Jędrzejewski-Szmek Date: Sun, 4 Aug 2013 13:04:20 +0000 (-0400) Subject: logs-show: add short-precise mode with us timestamps X-Git-Tag: v207~100 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=f02d836794d519e717e51d81501557da55915ce2 logs-show: add short-precise mode with us timestamps Also, always show us timestamps in verbose mode. https://bugzilla.redhat.com/show_bug.cgi?id=991678 --- diff --git a/man/journalctl.xml b/man/journalctl.xml index dcc6d5dce..8680e5328 100644 --- a/man/journalctl.xml +++ b/man/journalctl.xml @@ -253,12 +253,11 @@ - + - is very similar - but shows monotonic - timestamps instead of + is very similar, + but shows ISO 8601 wallclock timestamps. @@ -266,11 +265,25 @@ - + is very similar, - but shows ISO 8601 + but shows timestamps + with full microsecond + precision. + + + + + + + + + + is very similar + but shows monotonic + timestamps instead of wallclock timestamps. diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c index 5cf939024..27c148e68 100644 --- a/src/journal/journalctl.c +++ b/src/journal/journalctl.c @@ -134,8 +134,9 @@ static int help(void) { " -n --lines[=INTEGER] Number of journal entries to show\n" " --no-tail Show all lines, even in follow mode\n" " -r --reverse Show the newest entries first\n" - " -o --output=STRING Change journal output mode (short, short-monotonic, short-iso\n" - " verbose, export, json, json-pretty, json-sse, cat)\n" + " -o --output=STRING Change journal output mode (short, short-iso,\n" + " short-precise, short-monotonic, verbose,\n" + " export, json, json-pretty, json-sse, cat)\n" " -x --catalog Add message explanations where available\n" " -l --full Do not ellipsize fields\n" " -a --all Show all fields, including long and unprintable\n" diff --git a/src/shared/logs-show.c b/src/shared/logs-show.c index af738a313..700267530 100644 --- a/src/shared/logs-show.c +++ b/src/shared/logs-show.c @@ -318,10 +318,21 @@ static int output_short( } t = (time_t) (x / USEC_PER_SEC); - if (mode == OUTPUT_SHORT_ISO) + + switch(mode) { + case OUTPUT_SHORT_ISO: r = strftime(buf, sizeof(buf), "%Y-%m-%dT%H:%M:%S%z", localtime_r(&t, &tm)); - else + break; + case OUTPUT_SHORT_PRECISE: + r = strftime(buf, sizeof(buf), "%b %d %H:%M:%S", localtime_r(&t, &tm)); + if (r > 0) { + snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), + ".%06llu", x % USEC_PER_SEC); + } + break; + default: r = strftime(buf, sizeof(buf), "%b %d %H:%M:%S", localtime_r(&t, &tm)); + } if (r <= 0) { log_error("Failed to format time."); @@ -380,7 +391,7 @@ static int output_verbose( size_t length; _cleanup_free_ char *cursor = NULL; uint64_t realtime; - char ts[FORMAT_TIMESTAMP_MAX]; + char ts[FORMAT_TIMESTAMP_MAX + 7]; int r; assert(f); @@ -402,7 +413,7 @@ static int output_verbose( } fprintf(f, "%s [%s]\n", - format_timestamp(ts, sizeof(ts), realtime), + format_timestamp_us(ts, sizeof(ts), realtime), cursor); JOURNAL_FOREACH_DATA_RETVAL(j, data, length, r) { @@ -849,8 +860,9 @@ static int (*output_funcs[_OUTPUT_MODE_MAX])( OutputFlags flags) = { [OUTPUT_SHORT] = output_short, - [OUTPUT_SHORT_MONOTONIC] = output_short, [OUTPUT_SHORT_ISO] = output_short, + [OUTPUT_SHORT_PRECISE] = output_short, + [OUTPUT_SHORT_MONOTONIC] = output_short, [OUTPUT_VERBOSE] = output_verbose, [OUTPUT_EXPORT] = output_export, [OUTPUT_JSON] = output_json, @@ -1131,8 +1143,9 @@ int show_journal_by_unit( static const char *const output_mode_table[_OUTPUT_MODE_MAX] = { [OUTPUT_SHORT] = "short", - [OUTPUT_SHORT_MONOTONIC] = "short-monotonic", [OUTPUT_SHORT_ISO] = "short-iso", + [OUTPUT_SHORT_PRECISE] = "short-precise", + [OUTPUT_SHORT_MONOTONIC] = "short-monotonic", [OUTPUT_VERBOSE] = "verbose", [OUTPUT_EXPORT] = "export", [OUTPUT_JSON] = "json", diff --git a/src/shared/output-mode.h b/src/shared/output-mode.h index 4012889b6..9da789db7 100644 --- a/src/shared/output-mode.h +++ b/src/shared/output-mode.h @@ -23,8 +23,9 @@ typedef enum OutputMode { OUTPUT_SHORT, - OUTPUT_SHORT_MONOTONIC, OUTPUT_SHORT_ISO, + OUTPUT_SHORT_PRECISE, + OUTPUT_SHORT_MONOTONIC, OUTPUT_VERBOSE, OUTPUT_EXPORT, OUTPUT_JSON, diff --git a/src/shared/time-util.c b/src/shared/time-util.c index 9ee711a49..860be61e8 100644 --- a/src/shared/time-util.c +++ b/src/shared/time-util.c @@ -168,6 +168,28 @@ char *format_timestamp(char *buf, size_t l, usec_t t) { return buf; } +char *format_timestamp_us(char *buf, size_t l, usec_t t) { + struct tm tm; + time_t sec; + + assert(buf); + assert(l > 0); + + if (t <= 0) + return NULL; + + sec = (time_t) (t / USEC_PER_SEC); + localtime_r(&sec, &tm); + + if (strftime(buf, l, "%a %Y-%m-%d %H:%M:%S", &tm) <= 0) + return NULL; + snprintf(buf + strlen(buf), l - strlen(buf), ".%06llu", t % USEC_PER_SEC); + if (strftime(buf + strlen(buf), l - strlen(buf), " %Z", &tm) <= 0) + return NULL; + + return buf; +} + char *format_timestamp_relative(char *buf, size_t l, usec_t t) { usec_t n, d; diff --git a/src/shared/time-util.h b/src/shared/time-util.h index f27a00689..7660fe187 100644 --- a/src/shared/time-util.h +++ b/src/shared/time-util.h @@ -73,6 +73,7 @@ usec_t timeval_load(const struct timeval *tv) _pure_; struct timeval *timeval_store(struct timeval *tv, usec_t u); char *format_timestamp(char *buf, size_t l, usec_t t); +char *format_timestamp_us(char *buf, size_t l, usec_t t); char *format_timestamp_relative(char *buf, size_t l, usec_t t); char *format_timespan(char *buf, size_t l, usec_t t, usec_t accuracy);