linux工具-journalctl
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