1. 程式人生 > >linux工具-journalctl

linux工具-journalctl

nginx linux服務 才會 chmod ini urn 定義 itl journal

有時候,當linux服務啟動失敗的時候,系統會提示我們使用journalctl -xe命令來查詢詳細信息,定位服務不能啟動的原因。

journalctl 用來查詢 systemd-journald 服務收集到的日誌。systemd-journald 服務是 systemd init 系統提供的收集系統日誌的服務。

命令格式為:

journalctl [OPTIONS…] [MATCHES…]

journalctl 命令的路徑為:

/bin/journalctl


可以使用man和-h來查詢詳細用法

man journalctl
journal ctl -h

技術分享圖片


輸出所有日誌

不帶任何選項時,journalctl 輸出所有的日誌記錄,沒啥鳥用


匹配(match)

我們可以通過 "FIELD=VALUE" 的格式來匹配具體的日誌記錄, 如:_SYSTEMD_UNIT=sshd.service

journalctl _SYSTEMD_UNIT=sshd.service

技術分享圖片

日誌信息的定義也類似一個實體類型,具體的信息被保存在各個對應的字段中,比如 MESSAGE、MESSAGE_ID、_PID、_UID、_HOSTNAME、_SYSTEMD_UNIT 等等(通過 man 7 systemd.journal-fields 可以查看所有可用的 match 字段)。因此可以通過這些字段的內容匹配相關的日誌記錄:


可以同時添加多個字段進行匹配,它們之間是與的關系,就是同時符合多個條件的記錄才會被匹配,比如添加 PRIORITY 字段的匹配條件:

journalctl _SYSTEMD_UNIT=sshd.service PRIORITY=6

技術分享圖片


註意各個字段的取值,比如為 PRIORITY 設置 debug、info 是不工作的,必須設置為對應的數字。可以通過 -F 選項來查看某個字段的可選值:

技術分享圖片

0: emerg

1: alert

2: crit

3: err

4: warning

5: notice

6: info

7: debug



對同一個字段應用多個 match 條件的情況,比如:

journalctl _SYSTEMD_UNIT=sshd.service _SYSTEMD_UNIT=httpd.service


此時 ,兩個服務的日誌都會輸出過來


多個 match 條件的或操作



使用 "+" 號可以對多個匹配字段執行或操作:

 journalctl _SYSTEMD_UNIT=sshd.servcie + _PID=28097



上面的命令會輸出 sshd.service 的日誌和進程 28097 的日誌。

systemd-journald 服務收集到的日誌默認保存在 /run/log 目錄中,重啟系統會丟掉以前的日誌信息。 我們可以通過兩種方式讓 systemd-journald 服務把所有的日誌都保存到文件中,這樣重新啟動後就不會丟掉以前的日誌。

把日誌保存到文件中

方法一:創建目錄 /var/log/journal,然後重啟日誌服務 systemd-journald.service。
技術分享圖片

方法二:修改配置文件 /etc/systemd/journald.conf,把 Storage=auto 改為 Storage=persistent,並取消註釋,然後重啟日誌服務 systemd-journald.service。

方法一的詳細操作

在 /var/log/ 下面創建名為 journal 的目錄,並設置權限即可:

mkdir /var/log/journal
chown root:systemd-journal /var/log/journal
chmod 2775 /var/log/journal
systemctl restart systemd-journald.service



之後 /run/log 下面就沒有 journal 的日誌了,日誌文件被保存在 /var/log/journal 目錄下:

技術分享圖片



查看重啟後的日誌

journalctl --list-boots

技術分享圖片

可以看到,每次重啟的信息都存在了


此時我們就可以通過 -b 選項來選擇查看某次運行過程中的日誌:

journalctl -b -1

技術分享圖片



journalctl -b 9eaabbc25fe343999ef1024e6a16fb58


下面的命令都會輸出最後一次啟動後的日誌信息:

journalctl -b
journalctl -b 0


查看指定時間段的日誌

利用 --since 與 --until 選項設定時間段,二者分別負責指定給定時間之前與之後的日誌記錄。時間值可以使用多種格式,比如下面的格式:

YYYY-MM-DD HH:MM:SS


如果我們要查詢 2018 年 3 月 26 日下午 8:20 之後的日誌:

journalctl --since "2018-03-26 20:20:00"


如果以上格式中的某些組成部分未進行填寫,系統會直接進行默認填充。例如,如果日期部分未填寫,則會直接顯示當前日期。如果時間部分未填寫,則缺省使用 "00:00:00"(午夜)。秒字段亦可留空,默認值為 "00",比如下面的命令:

journalctl --since "2018-03-26" --until "2018-03-26 03:00"



另外,journalctl 還能夠理解部分相對值及命名簡寫。例如,大家可以使用 "yesterday"、"today"、"tomorrow" 或者 "now" 等。

比如獲取昨天的日誌數據可以使用下面的命令:

journalctl --since yesterday



要獲得早上 9:00 到一小時前這段時間內的日誌,可以使用下面的命令:

journalctl --since 09:00 --until "1 hour ago"



同時應用 match 和時間過濾條件

實際的使用中更常見的用例是同時應用 match 和時間條件,比如要過濾出某個時間段中sshd服務的日誌記錄:

journalctl _SYSTEMD_UNIT=sshd.service --since "2018-07-28" --until "2018-7-29 01:00"


按 unit 過濾日誌

systemd 把幾乎所有的任務都抽象成了 unit,因此我們可以方便的使用 -u 選項通過 unit 的名稱來過濾器日誌記錄。查看某個 unit 的日誌:

journalctl -u ssd.service
journalctl -u nginx.service --since today



還可以使用多個 -u 選項同時獲得多個 unit 的日誌:

journalctl -u nginx.service -u php-fpm.service --since today



linux工具-journalctl