mirror of
https://github.com/systemd/systemd
synced 2024-09-06 16:56:43 +00:00
journalctl: add --truncate-newline option
This commit is contained in:
parent
9a109e7cd6
commit
61cecfa0d8
|
@ -429,6 +429,13 @@
|
||||||
precision.</para></listitem>
|
precision.</para></listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>--truncate-newline</option></term>
|
||||||
|
|
||||||
|
<listitem><para>Truncate each log message at the first newline character on output, so that only the
|
||||||
|
first line of each message is displayed.</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term><option>short-precise</option></term>
|
<term><option>short-precise</option></term>
|
||||||
<listitem><para>is very similar, but shows classic syslog timestamps with full microsecond
|
<listitem><para>is very similar, but shows classic syslog timestamps with full microsecond
|
||||||
|
|
|
@ -170,10 +170,15 @@ char *delete_trailing_chars(char *s, const char *bad) {
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *truncate_nl(char *s) {
|
char *truncate_nl_full(char *s, size_t *ret_len) {
|
||||||
|
size_t n;
|
||||||
|
|
||||||
assert(s);
|
assert(s);
|
||||||
|
|
||||||
s[strcspn(s, NEWLINE)] = 0;
|
n = strcspn(s, NEWLINE);
|
||||||
|
s[n] = '\0';
|
||||||
|
if (ret_len)
|
||||||
|
*ret_len = n;
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -121,7 +121,10 @@ char *strjoin_real(const char *x, ...) _sentinel_;
|
||||||
char *strstrip(char *s);
|
char *strstrip(char *s);
|
||||||
char *delete_chars(char *s, const char *bad);
|
char *delete_chars(char *s, const char *bad);
|
||||||
char *delete_trailing_chars(char *s, const char *bad);
|
char *delete_trailing_chars(char *s, const char *bad);
|
||||||
char *truncate_nl(char *s);
|
char *truncate_nl_full(char *s, size_t *ret_len);
|
||||||
|
static inline char *truncate_nl(char *s) {
|
||||||
|
return truncate_nl_full(s, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
static inline char *skip_leading_chars(const char *s, const char *bad) {
|
static inline char *skip_leading_chars(const char *s, const char *bad) {
|
||||||
if (!s)
|
if (!s)
|
||||||
|
|
|
@ -96,6 +96,7 @@ static bool arg_all = false;
|
||||||
static PagerFlags arg_pager_flags = 0;
|
static PagerFlags arg_pager_flags = 0;
|
||||||
static int arg_lines = ARG_LINES_DEFAULT;
|
static int arg_lines = ARG_LINES_DEFAULT;
|
||||||
static bool arg_no_tail = false;
|
static bool arg_no_tail = false;
|
||||||
|
static bool arg_truncate_newline = false;
|
||||||
static bool arg_quiet = false;
|
static bool arg_quiet = false;
|
||||||
static bool arg_merge = false;
|
static bool arg_merge = false;
|
||||||
static bool arg_boot = false;
|
static bool arg_boot = false;
|
||||||
|
@ -367,6 +368,7 @@ static int help(void) {
|
||||||
" -a --all Show all fields, including long and unprintable\n"
|
" -a --all Show all fields, including long and unprintable\n"
|
||||||
" -f --follow Follow the journal\n"
|
" -f --follow Follow the journal\n"
|
||||||
" --no-tail Show all lines, even in follow mode\n"
|
" --no-tail Show all lines, even in follow mode\n"
|
||||||
|
" --truncate-newline Truncate entries by first newline character\n"
|
||||||
" -q --quiet Do not show info messages and privilege warning\n"
|
" -q --quiet Do not show info messages and privilege warning\n"
|
||||||
"\n%3$sPager Control Options:%4$s\n"
|
"\n%3$sPager Control Options:%4$s\n"
|
||||||
" --no-pager Do not pipe output into a pager\n"
|
" --no-pager Do not pipe output into a pager\n"
|
||||||
|
@ -445,6 +447,7 @@ static int parse_argv(int argc, char *argv[]) {
|
||||||
ARG_RELINQUISH_VAR,
|
ARG_RELINQUISH_VAR,
|
||||||
ARG_SMART_RELINQUISH_VAR,
|
ARG_SMART_RELINQUISH_VAR,
|
||||||
ARG_ROTATE,
|
ARG_ROTATE,
|
||||||
|
ARG_TRUNCATE_NEWLINE,
|
||||||
ARG_VACUUM_SIZE,
|
ARG_VACUUM_SIZE,
|
||||||
ARG_VACUUM_FILES,
|
ARG_VACUUM_FILES,
|
||||||
ARG_VACUUM_TIME,
|
ARG_VACUUM_TIME,
|
||||||
|
@ -465,6 +468,7 @@ static int parse_argv(int argc, char *argv[]) {
|
||||||
{ "full", no_argument, NULL, 'l' },
|
{ "full", no_argument, NULL, 'l' },
|
||||||
{ "no-full", no_argument, NULL, ARG_NO_FULL },
|
{ "no-full", no_argument, NULL, ARG_NO_FULL },
|
||||||
{ "lines", optional_argument, NULL, 'n' },
|
{ "lines", optional_argument, NULL, 'n' },
|
||||||
|
{ "truncate-newline", no_argument, NULL, ARG_TRUNCATE_NEWLINE },
|
||||||
{ "no-tail", no_argument, NULL, ARG_NO_TAIL },
|
{ "no-tail", no_argument, NULL, ARG_NO_TAIL },
|
||||||
{ "new-id128", no_argument, NULL, ARG_NEW_ID128 }, /* deprecated */
|
{ "new-id128", no_argument, NULL, ARG_NEW_ID128 }, /* deprecated */
|
||||||
{ "quiet", no_argument, NULL, 'q' },
|
{ "quiet", no_argument, NULL, 'q' },
|
||||||
|
@ -622,6 +626,10 @@ static int parse_argv(int argc, char *argv[]) {
|
||||||
arg_no_tail = true;
|
arg_no_tail = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case ARG_TRUNCATE_NEWLINE:
|
||||||
|
arg_truncate_newline = true;
|
||||||
|
break;
|
||||||
|
|
||||||
case ARG_NEW_ID128:
|
case ARG_NEW_ID128:
|
||||||
arg_action = ACTION_NEW_ID128;
|
arg_action = ACTION_NEW_ID128;
|
||||||
break;
|
break;
|
||||||
|
@ -2229,6 +2237,7 @@ static int show(Context *c) {
|
||||||
colors_enabled() * OUTPUT_COLOR |
|
colors_enabled() * OUTPUT_COLOR |
|
||||||
arg_catalog * OUTPUT_CATALOG |
|
arg_catalog * OUTPUT_CATALOG |
|
||||||
arg_utc * OUTPUT_UTC |
|
arg_utc * OUTPUT_UTC |
|
||||||
|
arg_truncate_newline * OUTPUT_TRUNCATE_NEWLINE |
|
||||||
arg_no_hostname * OUTPUT_NO_HOSTNAME;
|
arg_no_hostname * OUTPUT_NO_HOSTNAME;
|
||||||
|
|
||||||
r = show_journal_entry(stdout, j, arg_output, 0, flags,
|
r = show_journal_entry(stdout, j, arg_output, 0, flags,
|
||||||
|
|
|
@ -524,6 +524,9 @@ static int output_short(
|
||||||
if (!(flags & OUTPUT_SHOW_ALL))
|
if (!(flags & OUTPUT_SHOW_ALL))
|
||||||
strip_tab_ansi(&message, &message_len, highlight_shifted);
|
strip_tab_ansi(&message, &message_len, highlight_shifted);
|
||||||
|
|
||||||
|
if (flags & OUTPUT_TRUNCATE_NEWLINE)
|
||||||
|
truncate_nl_full(message, &message_len);
|
||||||
|
|
||||||
if (priority_len == 1 && *priority >= '0' && *priority <= '7')
|
if (priority_len == 1 && *priority >= '0' && *priority <= '7')
|
||||||
p = *priority - '0';
|
p = *priority - '0';
|
||||||
|
|
||||||
|
|
|
@ -33,21 +33,22 @@ static inline bool OUTPUT_MODE_IS_JSON(OutputMode m) {
|
||||||
* logs output, others only to the process tree output. */
|
* logs output, others only to the process tree output. */
|
||||||
|
|
||||||
typedef enum OutputFlags {
|
typedef enum OutputFlags {
|
||||||
OUTPUT_SHOW_ALL = 1 << 0,
|
OUTPUT_SHOW_ALL = 1 << 0,
|
||||||
OUTPUT_FULL_WIDTH = 1 << 1,
|
OUTPUT_FULL_WIDTH = 1 << 1,
|
||||||
OUTPUT_COLOR = 1 << 2,
|
OUTPUT_COLOR = 1 << 2,
|
||||||
|
|
||||||
/* Specific to log output */
|
/* Specific to log output */
|
||||||
OUTPUT_WARN_CUTOFF = 1 << 3,
|
OUTPUT_WARN_CUTOFF = 1 << 3,
|
||||||
OUTPUT_CATALOG = 1 << 4,
|
OUTPUT_CATALOG = 1 << 4,
|
||||||
OUTPUT_BEGIN_NEWLINE = 1 << 5,
|
OUTPUT_BEGIN_NEWLINE = 1 << 5,
|
||||||
OUTPUT_UTC = 1 << 6,
|
OUTPUT_UTC = 1 << 6,
|
||||||
OUTPUT_NO_HOSTNAME = 1 << 7,
|
OUTPUT_NO_HOSTNAME = 1 << 7,
|
||||||
|
OUTPUT_TRUNCATE_NEWLINE = 1 << 8,
|
||||||
|
|
||||||
/* Specific to process tree output */
|
/* Specific to process tree output */
|
||||||
OUTPUT_KERNEL_THREADS = 1 << 8,
|
OUTPUT_KERNEL_THREADS = 1 << 9,
|
||||||
OUTPUT_CGROUP_XATTRS = 1 << 9,
|
OUTPUT_CGROUP_XATTRS = 1 << 10,
|
||||||
OUTPUT_CGROUP_ID = 1 << 10,
|
OUTPUT_CGROUP_ID = 1 << 11,
|
||||||
} OutputFlags;
|
} OutputFlags;
|
||||||
|
|
||||||
JsonFormatFlags output_mode_to_json_format_flags(OutputMode m);
|
JsonFormatFlags output_mode_to_json_format_flags(OutputMode m);
|
||||||
|
|
|
@ -14,6 +14,10 @@ test_append_files() {
|
||||||
cp -av "${TEST_BASE_DIR:?}/test-journals/"* "$workspace/test-journals/"
|
cp -av "${TEST_BASE_DIR:?}/test-journals/"* "$workspace/test-journals/"
|
||||||
|
|
||||||
inst_binary unzstd
|
inst_binary unzstd
|
||||||
|
|
||||||
|
(
|
||||||
|
command -v logger >/dev/null 2>&1 && inst_binary logger
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
do_test "$@"
|
do_test "$@"
|
||||||
|
|
|
@ -51,6 +51,17 @@ grep -q '^PRIORITY=6$' /tmp/output
|
||||||
(! grep '^FOO=' /tmp/output)
|
(! grep '^FOO=' /tmp/output)
|
||||||
(! grep '^SYSLOG_FACILITY=' /tmp/output)
|
(! grep '^SYSLOG_FACILITY=' /tmp/output)
|
||||||
|
|
||||||
|
# --truncate shows only first line, skip under asan due to logger
|
||||||
|
if [ -z "${ASAN_OPTIONS+x}${UBSAN_OPTIONS+x}" ] && command -v logger >/dev/null 2>&1 ;then
|
||||||
|
ID=$(journalctl --new-id128 | sed -n 2p)
|
||||||
|
logger -t "$ID" $'HEAD\nTAIL\nTAIL'
|
||||||
|
journalctl --sync
|
||||||
|
journalctl -q -b -t "$ID" | grep -q HEAD
|
||||||
|
journalctl -q -b -t "$ID" | grep -q TAIL
|
||||||
|
journalctl -q -b -t "$ID" --truncate-newline | grep -q HEAD
|
||||||
|
journalctl -q -b -t "$ID" --truncate-newline | grep -q -v TAIL
|
||||||
|
fi
|
||||||
|
|
||||||
# '-b all' negates earlier use of -b (-b and -m are otherwise exclusive)
|
# '-b all' negates earlier use of -b (-b and -m are otherwise exclusive)
|
||||||
journalctl -b -1 -b all -m >/dev/null
|
journalctl -b -1 -b all -m >/dev/null
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue