AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 754953
Accepted
artfulrobot
artfulrobot
Asked: 2016-02-10 02:41:07 +0800 CST2016-02-10 02:41:07 +0800 CST 2016-02-10 02:41:07 +0800 CST

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

  • 772

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.*/"

而且您不想通过点击tab后进行试验MESSAGE=- 挂起 (zsh/Debian Jessie) shell 并且Ctrl-C也没有帮助!

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

谢谢。

systemd
  • 3 3 个回答
  • 32791 Views

3 个回答

  • Voted
  1. Tombart
    2021-03-01T04:54:05+08:002021-03-01T04:54:05+08:00

    由于systemctl --version版本237可能有带有-g/--grep开关的 grep 模式支持,但它必须在PRCE2支持的情况下编译(它似乎不包含在 Debian Buster中,>=242是必需的,可以安装 from buster-backports)

    journalctl -g ipsets*
    

    如果没有 grep 支持,您仍然可以切换到cat输出模式并使用grep's 匹配:

    journalctl -b -o cat --no-pager | grep "update-ipsets"
    

    如果您想要一个寻呼机,最好将结果通过管道传输到less. 您可以使用反转匹配-v / --invert-match来排除某些消息

    journalctl -b -o cat --no-pager | grep -v "ACPI" | less
    

    另一种选择是使用json格式:

    journalctl -b -o json | jq -C . | less -R
    

    给出详细的输出,单行

    {
      "SYSLOG_IDENTIFIER": "kernel",
      "_MACHINE_ID": "d72735cff36a41f0a5326f0bb7eb1778",
      "_SOURCE_MONOTONIC_TIMESTAMP": "0",
      "__REALTIME_TIMESTAMP": "1614516018297106",
      "__CURSOR": "s=2b1deb3dba3e42e4a758cc8f011d19c5;i=1;b=c0f6b0e5143a4d3db9f04f00da1a4ff4;m=670dd9;t=5bc64cdc13912;x=ee44184076fc0590",
      "__MONOTONIC_TIMESTAMP": "6753753",
      "SYSLOG_FACILITY": "0",
      "_HOSTNAME": "w16",
      "PRIORITY": "5",
      "_BOOT_ID": "c0f6b0e5143a4d3db9f04f00da1a4ff4",
      "_TRANSPORT": "kernel",
      "MESSAGE": "Linux version 4.19.0-14-amd64 ([email protected]) (gcc version 8.3.0 (Debian 8.3.0-6)) #1 SMP Debian 4.19.171-2 (2021-01-30)"
    }
    

    使用jq您可以轻松地归档消息:

    $ journalctl -b -o json | jq '. | select(._COMM=="sensors")' | jq -r .MESSAGE | less
    $ journalctl -b -o json | jq '. | select(._TRANSPORT=="kernel")' | jq -r .MESSAGE | head -n 1
    Linux version 4.19.0-14-amd64 ([email protected]) (gcc version 8.3.0 (Debian 8.3.0-6)) #1 SMP Debian 4.19.171-2 (2021-01-30)
    
    • 11
  2. Best Answer
    Emanuele Di Giacomo
    2016-10-06T00:35:16+08:002016-10-06T00:35:16+08:00

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

    我遇到了同样的问题,我认为只有在作为参数传递journalctl时才搜索 VALUE 的完全匹配。NAME=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. 源代码

      函数fnmatchinsrc/journal仅在搜索单位时使用。

    3. 调试日志ctl

      启用调试输出,您可以看到模式仅在使用-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*
      ...
      
    • 9
  3. Serge
    2022-06-04T09:29:13+08:002022-06-04T09:29:13+08:00

    使用 journalctl 版本 247.3-7(作为 systemd),--grep(或 -g)选项允许过滤日志中 MESSAGE 字段包含字符串或匹配正则表达式的行。

    man journalctl 说:

    **-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.
    

    journalctl 手册和 pcre2pattern 中都没有说的是,正则表达式必须用单引号或双引号括起来,并且不能有其他字符!

    如果您以 root 身份或使用 sudo 运行以下命令:

    # journalctl --grep "UFW BLOCK"
    

    您将获得所有记录的块 ID 的列表以及被防火墙阻止的请求...

    希望这有帮助!

    • 1

相关问题

  • SSH 会话在关机/重启时挂起

  • 我可以使用 systemd 重新启动依赖服务吗?

  • 让我的旧初始化脚本在 systemd 中工作的最简单方法是什么?

  • 在 CentOS 7 上为 systemd 启动的进程增加 nproc

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve