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;