From 54ff74d2731bebbdc96e12d4a631068c5060c62f Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 30 Apr 2020 14:52:18 +0200 Subject: [PATCH 1/4] journal: use set_contains() where appropriate --- src/shared/logs-show.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shared/logs-show.c b/src/shared/logs-show.c index 2bfd0b60c2..6f8de02781 100644 --- a/src/shared/logs-show.c +++ b/src/shared/logs-show.c @@ -131,7 +131,7 @@ static int field_set_test(Set *fields, const char *name, size_t n) { if (!s) return log_oom(); - return set_get(fields, s) ? 1 : 0; + return set_contains(fields, s); } static bool shall_print(const char *p, size_t l, OutputFlags flags) { From 4d5d1bba731f7dabc4511abce305584d769dfe60 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 30 Apr 2020 14:52:25 +0200 Subject: [PATCH 2/4] journalctl: optionally, show a different field than MESSAGE in -o cat mode Fixes: #15621 --- src/shared/logs-show.c | 98 ++++++++++++++++++++++++++---------------- 1 file changed, 62 insertions(+), 36 deletions(-) diff --git a/src/shared/logs-show.c b/src/shared/logs-show.c index 6f8de02781..6737cda1d2 100644 --- a/src/shared/logs-show.c +++ b/src/shared/logs-show.c @@ -1016,6 +1016,57 @@ finish: return r; } +static int output_cat_field( + FILE *f, + sd_journal *j, + OutputFlags flags, + const char *field, + const size_t highlight[2]) { + + const char *highlight_on, *highlight_off; + const void *data; + size_t l, fl; + int r; + + if (FLAGS_SET(flags, OUTPUT_COLOR)) { + highlight_on = ANSI_HIGHLIGHT_RED; + highlight_off = ANSI_NORMAL; + } else + highlight_on = highlight_off = ""; + + r = sd_journal_get_data(j, field, &data, &l); + if (r == -EBADMSG) { + log_debug_errno(r, "Skipping message we can't read: %m"); + return 0; + } + if (r == -ENOENT) /* An entry without the requested field */ + return 0; + if (r < 0) + return log_error_errno(r, "Failed to get data: %m"); + + fl = strlen(field); + assert(l >= fl + 1); + assert(((char*) data)[fl] == '='); + + data = (const uint8_t*) data + fl + 1; + l -= fl + 1; + + if (highlight && FLAGS_SET(flags, OUTPUT_COLOR)) { + assert(highlight[0] <= highlight[1]); + assert(highlight[1] <= l); + + fwrite((const char*) data, 1, highlight[0], f); + fwrite(highlight_on, 1, strlen(highlight_on), f); + fwrite((const char*) data + highlight[0], 1, highlight[1] - highlight[0], f); + fwrite(highlight_off, 1, strlen(highlight_off), f); + fwrite((const char*) data + highlight[1], 1, l - highlight[1], f); + } else + fwrite((const char*) data, 1, l, f); + + fputc('\n', f); + return 0; +} + static int output_cat( FILE *f, sd_journal *j, @@ -1025,49 +1076,24 @@ static int output_cat( Set *output_fields, const size_t highlight[2]) { - const void *data; - size_t l; + const char *field; + Iterator iterator; int r; - const char *highlight_on = "", *highlight_off = ""; assert(j); assert(f); - if (flags & OUTPUT_COLOR) { - highlight_on = ANSI_HIGHLIGHT_RED; - highlight_off = ANSI_NORMAL; + (void) sd_journal_set_data_threshold(j, 0); + + if (set_isempty(output_fields)) + return output_cat_field(f, j, flags, "MESSAGE", highlight); + + SET_FOREACH(field, output_fields, iterator) { + r = output_cat_field(f, j, flags, field, streq(field, "MESSAGE") ? highlight : NULL); + if (r < 0) + return r; } - sd_journal_set_data_threshold(j, 0); - - r = sd_journal_get_data(j, "MESSAGE", &data, &l); - if (r == -EBADMSG) { - log_debug_errno(r, "Skipping message we can't read: %m"); - return 0; - } - if (r < 0) { - /* An entry without MESSAGE=? */ - if (r == -ENOENT) - return 0; - - return log_error_errno(r, "Failed to get data: %m"); - } - - assert(l >= 8); - - if (highlight && (flags & OUTPUT_COLOR)) { - assert(highlight[0] <= highlight[1]); - assert(highlight[1] <= l - 8); - - fwrite((const char*) data + 8, 1, highlight[0], f); - fwrite(highlight_on, 1, strlen(highlight_on), f); - fwrite((const char*) data + 8 + highlight[0], 1, highlight[1] - highlight[0], f); - fwrite(highlight_off, 1, strlen(highlight_off), f); - fwrite((const char*) data + 8 + highlight[1], 1, l - 8 - highlight[1], f); - } else - fwrite((const char*) data + 8, 1, l - 8, f); - fputc('\n', f); - return 0; } From e0e3d387268f5e1b6692c3bb3730ff349528927b Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 30 Apr 2020 14:53:14 +0200 Subject: [PATCH 3/4] man: document the new -o cat feature --- man/journalctl.xml | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/man/journalctl.xml b/man/journalctl.xml index d6d475ed97..6e4728b013 100644 --- a/man/journalctl.xml +++ b/man/journalctl.xml @@ -374,9 +374,10 @@ - generates a very terse output, only showing the - actual message of each journal entry with no metadata, - not even a timestamp. + generates a very terse output, only showing the actual message of each journal entry + with no metadata, not even a timestamp. If combined with the + option will output the listed fields for each log record, + instead of the message. @@ -398,10 +399,11 @@ - A comma separated list of the fields which should be included in the output. This has an - effect only for the output modes which would normally show all fields (, - , , , and - ). The __CURSOR, __REALTIME_TIMESTAMP, + A comma separated list of the fields which should be included in the output. This has + an effect only for the output modes which would normally show all fields (, + , , , + and ), as well as on . For the + former, the __CURSOR, __REALTIME_TIMESTAMP, __MONOTONIC_TIMESTAMP, and _BOOT_ID fields are always printed. From 5444520628830aacab85be630a6cdeb179ff510b Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 5 May 2020 09:21:10 +0200 Subject: [PATCH 4/4] logs-show: declare [static 2] on all highlight parameters --- src/shared/logs-show.c | 18 +++++++++--------- src/shared/logs-show.h | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/shared/logs-show.c b/src/shared/logs-show.c index 6737cda1d2..a55d307447 100644 --- a/src/shared/logs-show.c +++ b/src/shared/logs-show.c @@ -158,7 +158,7 @@ static bool print_multiline( bool audit, const char* message, size_t message_len, - size_t highlight[2]) { + size_t highlight[static 2]) { const char *color_on = "", *color_off = "", *highlight_on = ""; const char *pos, *end; @@ -370,7 +370,7 @@ static int output_short( unsigned n_columns, OutputFlags flags, Set *output_fields, - const size_t highlight[2]) { + const size_t highlight[static 2]) { int r; const void *data; @@ -534,7 +534,7 @@ static int output_verbose( unsigned n_columns, OutputFlags flags, Set *output_fields, - const size_t highlight[2]) { + const size_t highlight[static 2]) { const void *data; size_t length; @@ -653,7 +653,7 @@ static int output_export( unsigned n_columns, OutputFlags flags, Set *output_fields, - const size_t highlight[2]) { + const size_t highlight[static 2]) { sd_id128_t boot_id; char sid[SD_ID128_STRING_MAX]; @@ -883,7 +883,7 @@ static int output_json( unsigned n_columns, OutputFlags flags, Set *output_fields, - const size_t highlight[2]) { + const size_t highlight[static 2]) { char sid[SD_ID128_STRING_MAX], usecbuf[DECIMAL_STR_MAX(usec_t)]; _cleanup_(json_variant_unrefp) JsonVariant *object = NULL; @@ -1021,7 +1021,7 @@ static int output_cat_field( sd_journal *j, OutputFlags flags, const char *field, - const size_t highlight[2]) { + const size_t highlight[static 2]) { const char *highlight_on, *highlight_off; const void *data; @@ -1074,7 +1074,7 @@ static int output_cat( unsigned n_columns, OutputFlags flags, Set *output_fields, - const size_t highlight[2]) { + const size_t highlight[static 2]) { const char *field; Iterator iterator; @@ -1104,7 +1104,7 @@ static int (*output_funcs[_OUTPUT_MODE_MAX])( unsigned n_columns, OutputFlags flags, Set *output_fields, - const size_t highlight[2]) = { + const size_t highlight[static 2]) = { [OUTPUT_SHORT] = output_short, [OUTPUT_SHORT_ISO] = output_short, @@ -1130,7 +1130,7 @@ int show_journal_entry( unsigned n_columns, OutputFlags flags, char **output_fields, - const size_t highlight[2], + const size_t highlight[static 2], bool *ellipsized) { int ret; diff --git a/src/shared/logs-show.h b/src/shared/logs-show.h index 345efa4b2b..62be1b157f 100644 --- a/src/shared/logs-show.h +++ b/src/shared/logs-show.h @@ -20,7 +20,7 @@ int show_journal_entry( unsigned n_columns, OutputFlags flags, char **output_fields, - const size_t highlight[2], + const size_t highlight[static 2], bool *ellipsized); int show_journal( FILE *f,