diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/journal/journalctl.c | 5 | ||||
-rw-r--r-- | src/shared/logs-show.c | 25 | ||||
-rw-r--r-- | src/shared/output-mode.h | 3 | ||||
-rw-r--r-- | src/shared/time-util.c | 22 | ||||
-rw-r--r-- | src/shared/time-util.h | 1 |
5 files changed, 47 insertions, 9 deletions
diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c index 5cf9390249..27c148e689 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 af738a313e..7002675301 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 4012889b65..9da789db76 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 9ee711a49e..860be61e8b 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 f27a006891..7660fe1872 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); |