From 49805b3d816aa2cd431690ac6571ca9a8acca55b Mon Sep 17 00:00:00 2001 From: Luca Boccassi Date: Tue, 22 May 2018 12:22:00 +0100 Subject: [PATCH] journalctl: add with-unit mode When dealing with a large number of template instances, for example when launching daemons per VRF, it is hard for operators to correlate log lines to arguments. Add a new with-unit mode which, if available, prefixes unit and user unit names when displaying its log messages instead of the syslog identifier. It will also use the full timestamp with timezones, like the short-full mode. --- man/journalctl.xml | 12 ++++++++++++ shell-completion/bash/journalctl | 2 +- shell-completion/zsh/_sd_outputmodes | 2 +- src/journal/journalctl.c | 2 +- src/shared/logs-show.c | 25 ++++++++++++++++++++----- src/shared/output-mode.c | 3 ++- src/shared/output-mode.h | 1 + 7 files changed, 38 insertions(+), 9 deletions(-) diff --git a/man/journalctl.xml b/man/journalctl.xml index 12d6a80c57..b43e266873 100644 --- a/man/journalctl.xml +++ b/man/journalctl.xml @@ -369,6 +369,18 @@ not even a timestamp. + + + + + + + similar to short-full, but prefixes the unit and + user unit names instead of the traditional syslog + identifier. Useful when using templated instances, as it + will include the arguments in the unit names. + + diff --git a/shell-completion/bash/journalctl b/shell-completion/bash/journalctl index d2b9a04706..8fcb42ad7b 100644 --- a/shell-completion/bash/journalctl +++ b/shell-completion/bash/journalctl @@ -66,7 +66,7 @@ _journalctl() { compopt -o filenames ;; --output|-o) - comps='short short-full short-iso short-iso-precise short-precise short-monotonic short-unix verbose export json json-pretty json-sse cat' + comps='short short-full short-iso short-iso-precise short-precise short-monotonic short-unix verbose export json json-pretty json-sse cat with-unit' ;; --field|-F) comps=$(journalctl --fields | sort 2>/dev/null) diff --git a/shell-completion/zsh/_sd_outputmodes b/shell-completion/zsh/_sd_outputmodes index 3b8850b3f0..70ff7233af 100644 --- a/shell-completion/zsh/_sd_outputmodes +++ b/shell-completion/zsh/_sd_outputmodes @@ -2,5 +2,5 @@ # SPDX-License-Identifier: LGPL-2.1+ local -a _output_opts -_output_opts=(short short-full short-iso short-iso-precise short-precise short-monotonic short-unix verbose export json json-pretty json-sse cat) +_output_opts=(short short-full short-iso short-iso-precise short-precise short-monotonic short-unix verbose export json json-pretty json-sse cat with-unit) _describe -t output 'output mode' _output_opts || compadd "$@" diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c index 92cf2eb122..26222ea28d 100644 --- a/src/journal/journalctl.c +++ b/src/journal/journalctl.c @@ -334,7 +334,7 @@ static void help(void) { " -o --output=STRING Change journal output mode (short, short-precise,\n" " short-iso, short-iso-precise, short-full,\n" " short-monotonic, short-unix, verbose, export,\n" - " json, json-pretty, json-sse, cat)\n" + " json, json-pretty, json-sse, cat, with-unit)\n" " --output-fields=LIST Select fields to print in verbose/export/json modes\n" " --utc Express time in Coordinated Universal Time (UTC)\n" " -x --catalog Add message explanations where available\n" diff --git a/src/shared/logs-show.c b/src/shared/logs-show.c index 26a1513a05..47becbf37c 100644 --- a/src/shared/logs-show.c +++ b/src/shared/logs-show.c @@ -306,7 +306,7 @@ static int output_timestamp_realtime(FILE *f, sd_journal *j, OutputMode mode, Ou return -EINVAL; } - if (mode == OUTPUT_SHORT_FULL) { + if (IN_SET(mode, OUTPUT_SHORT_FULL, OUTPUT_WITH_UNIT)) { const char *k; if (flags & OUTPUT_UTC) @@ -391,8 +391,8 @@ static int output_short( const void *data; size_t length; size_t n = 0; - _cleanup_free_ char *hostname = NULL, *identifier = NULL, *comm = NULL, *pid = NULL, *fake_pid = NULL, *message = NULL, *realtime = NULL, *monotonic = NULL, *priority = NULL; - size_t hostname_len = 0, identifier_len = 0, comm_len = 0, pid_len = 0, fake_pid_len = 0, message_len = 0, realtime_len = 0, monotonic_len = 0, priority_len = 0; + _cleanup_free_ char *hostname = NULL, *identifier = NULL, *comm = NULL, *pid = NULL, *fake_pid = NULL, *message = NULL, *realtime = NULL, *monotonic = NULL, *priority = NULL, *unit = NULL, *user_unit = NULL; + size_t hostname_len = 0, identifier_len = 0, comm_len = 0, pid_len = 0, fake_pid_len = 0, message_len = 0, realtime_len = 0, monotonic_len = 0, priority_len = 0, unit_len = 0, user_unit_len = 0; int p = LOG_INFO; bool ellipsized = false; const ParseFieldVec fields[] = { @@ -405,6 +405,8 @@ static int output_short( PARSE_FIELD_VEC_ENTRY("SYSLOG_IDENTIFIER=", &identifier, &identifier_len), PARSE_FIELD_VEC_ENTRY("_SOURCE_REALTIME_TIMESTAMP=", &realtime, &realtime_len), PARSE_FIELD_VEC_ENTRY("_SOURCE_MONOTONIC_TIMESTAMP=", &monotonic, &monotonic_len), + PARSE_FIELD_VEC_ENTRY("_SYSTEMD_UNIT=", &unit, &unit_len), + PARSE_FIELD_VEC_ENTRY("_SYSTEMD_USER_UNIT=", &user_unit, &user_unit_len), }; size_t highlight_shifted[] = {highlight ? highlight[0] : 0, highlight ? highlight[1] : 0}; @@ -462,7 +464,19 @@ static int output_short( n += hostname_len + 1; } - if (identifier && shall_print(identifier, identifier_len, flags)) { + if (mode == OUTPUT_WITH_UNIT && ((unit && shall_print(unit, unit_len, flags)) || (user_unit && shall_print(user_unit, user_unit_len, flags)))) { + if (unit) { + fprintf(f, " %.*s", (int) unit_len, unit); + n += unit_len + 1; + } + if (user_unit) { + if (unit) + fprintf(f, "/%.*s", (int) user_unit_len, user_unit); + else + fprintf(f, " %.*s", (int) user_unit_len, user_unit); + n += unit_len + 1; + } + } else if (identifier && shall_print(identifier, identifier_len, flags)) { fprintf(f, " %.*s", (int) identifier_len, identifier); n += identifier_len + 1; } else if (comm && shall_print(comm, comm_len, flags)) { @@ -1053,7 +1067,8 @@ static int (*output_funcs[_OUTPUT_MODE_MAX])( [OUTPUT_JSON] = output_json, [OUTPUT_JSON_PRETTY] = output_json, [OUTPUT_JSON_SSE] = output_json, - [OUTPUT_CAT] = output_cat + [OUTPUT_CAT] = output_cat, + [OUTPUT_WITH_UNIT] = output_short, }; int output_journal( diff --git a/src/shared/output-mode.c b/src/shared/output-mode.c index 89be1d68a1..1bb161794a 100644 --- a/src/shared/output-mode.c +++ b/src/shared/output-mode.c @@ -21,7 +21,8 @@ static const char *const output_mode_table[_OUTPUT_MODE_MAX] = { [OUTPUT_JSON] = "json", [OUTPUT_JSON_PRETTY] = "json-pretty", [OUTPUT_JSON_SSE] = "json-sse", - [OUTPUT_CAT] = "cat" + [OUTPUT_CAT] = "cat", + [OUTPUT_WITH_UNIT] = "with-unit", }; DEFINE_STRING_TABLE_LOOKUP(output_mode, OutputMode); diff --git a/src/shared/output-mode.h b/src/shared/output-mode.h index 3aa7b295e3..a44d528675 100644 --- a/src/shared/output-mode.h +++ b/src/shared/output-mode.h @@ -23,6 +23,7 @@ typedef enum OutputMode { OUTPUT_JSON_PRETTY, OUTPUT_JSON_SSE, OUTPUT_CAT, + OUTPUT_WITH_UNIT, _OUTPUT_MODE_MAX, _OUTPUT_MODE_INVALID = -1 } OutputMode;