systemd的journalctl:如何按消息过滤?


8

journalctl看起来像是查看日志的好工具,但是我仍然停留在一个简单的问题上:我想查看所有包含短语的cron消息update-ipsets

我当然可以做到

journalctl -u cron.service | grep update-ipsets

但随后您将失去journalctl输出的所有其他好处(颜色编码,自动分页,实时查看等)

我试过了:

journalctl -u cron.service MESSAGE=update-ipsets
journalctl -u cron.service "MESSAGE=*update-ipsets*"
journalctl -u cron.service "MESSAGE=.*update-ipsets.*"
journalctl -u cron.service "MESSAGE=/.*update-ipsets.*/"

而你不想实验击中tabMESSAGE=-挂起的(zsh的/ Debian的杰西)壳Ctrl-C都于事无补!

我有点不敢相信它没有内置此基本功能,所以我确定我一定错过了什么吗?

谢谢。

Answers:


3

当前,journalctl在字段匹配中不支持模式或通配符。grep是您最好的选择。

我有同样的问题,我认为journalctlNAME=VALUE作为参数传递时,仅搜索VALUE的完全匹配。

我的调查:

  1. 手册页

    journalctl(1)

    匹配说明中未提及该模式:

     [...] A match is in the format "FIELD=VALUE", e.g.
     "_SYSTEMD_UNIT=httpd.service", referring to the components
     of a structured journal entry. [...]
    

    手册页-u仅在描述选项时引用了一种模式。

       -u, --unit=UNIT|PATTERN
           Show messages for the specified systemd unit UNIT 
           (such as a service unit), or for any of the units
           matched by PATTERN. 
    
  2. 源代码

    仅在搜索单位时使用fnmatchin 功能src/journal

  3. 调试journalctl

    启用调试输出,您可以看到仅在使用时才扩展该模式-u

    $ SYSTEMD_LOG_LEVEL=debug journalctl -n1 -u gdm*
    ...
    Matched gdm.service with pattern _SYSTEMD_UNIT=gdm*
    Matched gdm.service with pattern UNIT=gdm*
    Journal filter: ((OBJECT_SYSTEMD_UNIT=gdm.service AND _UID=0) OR (UNIT=gdm.service AND _PID=1) OR (COREDUMP_UNIT=gdm.service AND _UID=0 AND MESSAGE_ID=fc2e22bc6ee647b6b90729ab34a250b1) OR _SYSTEMD_UNIT=gdm.service)
    ...
    

    所有匹配项均被视为完全匹配,包括UNIT

    $ SYSTEMD_LOG_LEVEL=debug journalctl -n1 UNIT=gdm.*
    ...
    Journal filter: UNIT=gdm*
    ...
    

1
请注意,这实际上是在上一个systemd版本github.com/systemd/systemd/commit/中
Bigon
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.