如何使用 systemd 的 journalctl 模式

如何使用 systemd 的 journalctl 模式

我正在尝试使用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

这是一个文档错误当页面上的拼写错误man被更新时,该页面就被关闭了。

该错误报告导致以下情况代码中的注释

我们实际上并不接受模式,因此不要这样说。

作为一种解决方法,您可以grep按照问题评论中的建议使用。如下所示:

journalctl | grep sshd

答案2

journalctl -v 239 支持过滤-g

journalactl 手册页

   -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

这叫做“匹配过滤”。就是这样。

如果原来的问题被写成“如何申请grepjournalctl输出”,然后你可以将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'))

成分:

  1. printf 'journalctl':这可以包括任何 journalctl 特定的选项(例如printf 'journalctl --follow'
  2. journalctl -q -F SYSLOG_IDENTIFIER:列出 SYSLOG_IDENTIFIER fileld 的所有值变体。
  3. grep '^ssh':通过任何可能的 grep RegEx 掩码进行过滤。
  4. 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,命令需要重新启动。

相关内容