Systemd

systemd 的 journalctl:如何按消息過濾?

  • February 28, 2021

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也沒有幫助!

我有點不敢相信它沒有內置這個基本功能,所以我確定我一定錯過了什麼?

謝謝。

目前,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. 
  1. 原始碼

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

引用自:https://serverfault.com/questions/754953