Merge pull request #7881 from keszybz/pcre

Add new --grep option to journalctl
This commit is contained in:
Lennart Poettering
2018-01-28 15:29:10 +01:00
committed by GitHub
12 changed files with 370 additions and 87 deletions
+73 -17
View File
@@ -166,8 +166,17 @@ static bool shall_print(const char *p, size_t l, OutputFlags flags) {
return true;
}
static bool print_multiline(FILE *f, unsigned prefix, unsigned n_columns, OutputFlags flags, int priority, const char* message, size_t message_len) {
const char *color_on = "", *color_off = "";
static bool print_multiline(
FILE *f,
unsigned prefix,
unsigned n_columns,
OutputFlags flags,
int priority,
const char* message,
size_t message_len,
size_t highlight[2]) {
const char *color_on = "", *color_off = "", *highlight_on = "";
const char *pos, *end;
bool ellipsized = false;
int line = 0;
@@ -176,9 +185,11 @@ static bool print_multiline(FILE *f, unsigned prefix, unsigned n_columns, Output
if (priority <= LOG_ERR) {
color_on = ANSI_HIGHLIGHT_RED;
color_off = ANSI_NORMAL;
highlight_on = ANSI_HIGHLIGHT;
} else if (priority <= LOG_NOTICE) {
color_on = ANSI_HIGHLIGHT;
color_off = ANSI_NORMAL;
highlight_on = ANSI_HIGHLIGHT_RED;
}
}
@@ -209,9 +220,28 @@ static bool print_multiline(FILE *f, unsigned prefix, unsigned n_columns, Output
if (flags & (OUTPUT_FULL_WIDTH | OUTPUT_SHOW_ALL) ||
(prefix + len + 1 < n_columns && !tail_line)) {
fprintf(f, "%*s%s%.*s%s\n",
continuation * prefix, "",
color_on, len, pos, color_off);
if (highlight &&
(size_t) (pos - message) <= highlight[0] &&
highlight[0] < (size_t) len) {
fprintf(f, "%*s%s%.*s",
continuation * prefix, "",
color_on, (int) highlight[0], pos);
fprintf(f, "%s%.*s",
highlight_on,
(int) (MIN((size_t) len, highlight[1]) - highlight[0]),
pos + highlight[0]);
if ((size_t) len > highlight[1])
fprintf(f, "%s%.*s",
color_on,
(int) (len - highlight[1]),
pos + highlight[1]);
fprintf(f, "%s\n", color_off);
} else
fprintf(f, "%*s%s%.*s%s\n",
continuation * prefix, "",
color_on, len, pos, color_off);
continue;
}
@@ -369,7 +399,8 @@ static int output_short(
OutputMode mode,
unsigned n_columns,
OutputFlags flags,
Set *output_fields) {
Set *output_fields,
size_t highlight[2]) {
int r;
const void *data;
@@ -390,6 +421,7 @@ static int output_short(
PARSE_FIELD_VEC_ENTRY("_SOURCE_REALTIME_TIMESTAMP=", &realtime, &realtime_len),
PARSE_FIELD_VEC_ENTRY("_SOURCE_MONOTONIC_TIMESTAMP=", &monotonic, &monotonic_len),
};
size_t highlight_shifted[] = {highlight ? highlight[0] : 0, highlight ? highlight[1] : 0};
assert(f);
assert(j);
@@ -421,7 +453,7 @@ static int output_short(
}
if (!(flags & OUTPUT_SHOW_ALL))
strip_tab_ansi(&message, &message_len);
strip_tab_ansi(&message, &message_len, highlight_shifted);
if (priority_len == 1 && *priority >= '0' && *priority <= '7')
p = *priority - '0';
@@ -468,7 +500,9 @@ static int output_short(
} else {
fputs(": ", f);
ellipsized |=
print_multiline(f, n + 2, n_columns, flags, p, message, message_len);
print_multiline(f, n + 2, n_columns, flags, p,
message, message_len,
highlight_shifted);
}
if (flags & OUTPUT_CATALOG)
@@ -483,7 +517,8 @@ static int output_verbose(
OutputMode mode,
unsigned n_columns,
OutputFlags flags,
Set *output_fields) {
Set *output_fields,
size_t highlight[2]) {
const void *data;
size_t length;
@@ -561,7 +596,7 @@ static int output_verbose(
(((length < PRINT_CHAR_THRESHOLD) || flags & OUTPUT_FULL_WIDTH)
&& utf8_is_printable(data, length))) {
fprintf(f, " %s%.*s=", on, fieldlen, (const char*)data);
print_multiline(f, 4 + fieldlen + 1, 0, OUTPUT_FULL_WIDTH, 0, c + 1, length - fieldlen - 1);
print_multiline(f, 4 + fieldlen + 1, 0, OUTPUT_FULL_WIDTH, 0, c + 1, length - fieldlen - 1, NULL);
fputs(off, f);
} else {
char bytes[FORMAT_BYTES_MAX];
@@ -590,7 +625,8 @@ static int output_export(
OutputMode mode,
unsigned n_columns,
OutputFlags flags,
Set *output_fields) {
Set *output_fields,
size_t highlight[2]) {
sd_id128_t boot_id;
char sid[33];
@@ -732,7 +768,8 @@ static int output_json(
OutputMode mode,
unsigned n_columns,
OutputFlags flags,
Set *output_fields) {
Set *output_fields,
size_t highlight[2]) {
uint64_t realtime, monotonic;
_cleanup_free_ char *cursor = NULL;
@@ -961,15 +998,22 @@ static int output_cat(
OutputMode mode,
unsigned n_columns,
OutputFlags flags,
Set *output_fields) {
Set *output_fields,
size_t highlight[2]) {
const void *data;
size_t l;
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;
}
sd_journal_set_data_threshold(j, 0);
r = sd_journal_get_data(j, "MESSAGE", &data, &l);
@@ -987,7 +1031,17 @@ static int output_cat(
assert(l >= 8);
fwrite((const char*) data + 8, 1, l - 8, f);
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;
@@ -999,7 +1053,8 @@ static int (*output_funcs[_OUTPUT_MODE_MAX])(
OutputMode mode,
unsigned n_columns,
OutputFlags flags,
Set *output_fields) = {
Set *output_fields,
size_t highlight[2]) = {
[OUTPUT_SHORT] = output_short,
[OUTPUT_SHORT_ISO] = output_short,
@@ -1023,6 +1078,7 @@ int output_journal(
unsigned n_columns,
OutputFlags flags,
char **output_fields,
size_t highlight[2],
bool *ellipsized) {
int ret;
@@ -1043,7 +1099,7 @@ int output_journal(
return ret;
}
ret = output_funcs[mode](f, j, mode, n_columns, flags, fields);
ret = output_funcs[mode](f, j, mode, n_columns, flags, fields, highlight);
if (ellipsized && ret > 0)
*ellipsized = true;
@@ -1125,7 +1181,7 @@ static int show_journal(FILE *f,
line++;
maybe_print_begin_newline(f, &flags);
r = output_journal(f, j, mode, n_columns, flags, NULL, ellipsized);
r = output_journal(f, j, mode, n_columns, flags, NULL, NULL, ellipsized);
if (r < 0)
return r;
}
+1
View File
@@ -39,6 +39,7 @@ int output_journal(
unsigned n_columns,
OutputFlags flags,
char **output_fields,
size_t highlight[2],
bool *ellipsized);
int add_match_this_boot(sd_journal *j, const char *machine);