我正在尝试使用journalctl
的模式匹配SYSLOG_IDENTIFIERS
。例如,我有大量带有 标记的消息sshd
:
$ journalctl -t sshd | wc -l
987
但如果我尝试使用模式匹配来找到它们:
$ journalctl -t 'ssh*'
-- No Entries --
$ journalctl -t 'ssh.*'
-- No Entries --
journalctl 手册页说模式应该可以工作,但我找不到有关如何在 systemd 中使用/定义模式的其他任何信息。
$ man journalctl
....
-t, --identifier=SYSLOG_IDENTIFIER|PATTERN
Show messages for the specified syslog identifier SYSLOG_IDENTIFIER,
or for any of the messages with a "SYSLOG_IDENTIFIER" matched by PATTERN.
我正在运行 ArchLinux:
$ journalctl --version
systemd 225
+PAM -AUDIT -SELINUX -IMA -APPARMOR +SMACK -SYSVINIT +UTMP +LIBCRYPTSETUP
+GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID -ELFUTILS +KMOD +IDN
答案1
答案2
journalctl -v 239 支持过滤-g
-g, --grep= Filter output to entries where the MESSAGE= field matches the specified regular expression. PERL-compatible regular expressions are used, see pcre2pattern(3) for a detailed description of the syntax. If the pattern is all lowercase, matching is case insensitive. Otherwise, matching is case sensitive. This can be overridden with the --case-sensitive option, see below.
答案3
原始问题标题“如何使用 systemd 的journalctl 模式“。这指向 journalctl 的一个非常具体的功能,称为“MATCHES”,而不是通用的正则表达式过滤。
“匹配”功能与其他所有功能一样,都非常详细,并且非常友好手册页其开篇即指出:
如果传递了一个或多个匹配参数,则会相应地过滤输出。
“匹配”功能旨在根据多个可能的过滤器过滤掉日志条目。
对于原始问题中的情况,我是这样处理的(我也运行 ArchLinux)。
首先,您需要知道您感兴趣的服务名称。我通常这样做:
systemctl | grep sshd
我明白了:
sshd.service loaded active running OpenSSH Daemon
然后,您可以要求journalctl
按“systemd 单元名称”进行过滤,如下所示:
journalctl _SYSTEMD_UNIT=sshd.service
这叫做“匹配过滤”。就是这样。
如果原来的问题被写成“如何申请grep
journalctl输出”,然后你可以将grep
“迄今为止”存储的日志应用于
journalctl | grep ssh
或者查看当前传入的日志条目
journalctl -f | grep ssh
然后按 CTRL-C 停止流。当然,您可以使用更复杂的管道,使用更细粒度的常规模式或多个grep
命令。
答案4
这是我的方法(允许将所有内容保留在 journalctl 中):
只需执行此命令:
$(printf 'journalctl'; printf ' -t %s' $(journalctl -q -F SYSLOG_IDENTIFIER | grep '^ssh'))
成分:
printf 'journalctl'
:这可以包括任何 journalctl 特定的选项(例如printf 'journalctl --follow'
)journalctl -q -F SYSLOG_IDENTIFIER
:列出 SYSLOG_IDENTIFIER fileld 的所有值变体。grep '^ssh'
:通过任何可能的 grep RegEx 掩码进行过滤。printf ' -t %s' $(journalctl -q -F SYSLOG_IDENTIFIER | grep '^ssh'))
:从过滤的 SYSLOG_IDENTIFIER 值列表中构建多个“-t”选项的序列。
例如:
$ echo "$(printf 'journalctl'; printf ' -t %s' $(journalctl -q -F SYSLOG_IDENTIFIER | grep '^gnome'))"
journalctl -t gnome-system-monitor.desktop -t gnome-shell -t gnome-keyring-daemon -t gnome-session-binary -t gnome-session
笔记,很明显,但很重要:在命令启动时创建的标识符列表(通过掩码选择),因此包括任何标识符,出现后 journalctl
使用选项启动--follow
,命令需要重新启动。