首頁 > 軟體

Linux journalctl 命令圖文超詳細講解

2020-06-16 18:06:44
journalctl 用來查詢 systemd-journald 服務收集到的紀錄檔。systemd-journald 服務是 systemd init 系統提供的收集系統紀錄檔的服務。

命令格式為:

journalctl [OPTIONS…] [MATCHES…]

journalctl 命令的路徑為:

/bin/journalctl

Help

可以通過 man page 和 -h 選項來獲得最直接的幫助文件:

$ man journalctl

$ journalctl -h

輸出所有的紀錄檔記錄

不帶任何選項時,journalctl 輸出所有的紀錄檔記錄:

$ sudo journalctl



這基本上沒什麼用處,因為你立即就被洪水般的紀錄檔記錄給淹沒了。所以,接下來我們學習如何高效的過濾出有價值的紀錄檔資訊。

匹配(match)

我們可以通過 "FIELD=VALUE" 的格式來匹配具體的紀錄檔記錄, 如:

_SYSTEMD_UNIT=cron.service

紀錄檔資訊的定義也類似一個實體型別,具體的資訊被儲存在各個對應的欄位中,比如 MESSAGE、MESSAGE_ID、_PID、_UID、_HOSTNAME、_SYSTEMD_UNIT 等等(通過 man 7 systemd.journal-fields 可以檢視所有可用的 match 欄位)。因此可以通過這些欄位的內容匹配相關的紀錄檔記錄:



上圖中的輸出是 cron.service 服務相關的紀錄檔記錄。

可以同時新增多個欄位進行匹配,它們之間是與的關係,就是同時符合多個條件的記錄才會被匹配,比如新增 PRIORITY 欄位的匹配條件:

$ journalctl _SYSTEMD_UNIT=cron.service PRIORITY=6



注意各個欄位的取值,比如為 PRIORITY 設定 debug、info 是不工作的,必須設定為對應的數位。可以通過 -F 選項來檢視某個欄位的可選值:

$ journal -F PRIORITY



具體的對應方式如下:

0: emerg

1: alert

2: crit

3: err

4: warning

5: notice

6: info

7: debug

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

$ journalctl _SYSTEMD_UNIT=cron.service _SYSTEMD_UNIT=prometheus.service

此時 cron.service 和 prometheus.service 的紀錄檔都會輸出。

多個 match 條件的或操作

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

$ journalctl _SYSTEMD_UNIT=cron.service + _PID=28097

上面的命令會輸出 cron.service 的紀錄檔和進程 28097 的紀錄檔。

下面是一個更複雜的例子:

$ journalctl _SYSTEMD_UNIT=avahi-daemon.service _PID=28097 + _SYSTEMD_UNIT=dbus.service

前面的兩個條件是與的關係,最後一個條件與前面的兩個條件是或的關係,也就是相對於用小括號把前面的兩個條件括起來。

把紀錄檔儲存到檔案中

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 的目錄,並設定許可權即可:

$ sudo mkdir /var/log/journal

$ sudo chown root:systemd-journal /var/log/journal

$ sudo chmod 2775 /var/log/journal

$ sudo systemctl restart systemd-journald.service

之後 /run/log 下面就沒有 journal 的紀錄檔了,紀錄檔檔案被儲存在 /var/log/journal 目錄下:



檢視紀錄檔占據的磁碟空間

$ sudo journalctl --disk-usage



注意:無論是否設定把紀錄檔儲存到檔案,都會得到 disk-usage。

清理紀錄檔資料

如果大家打算對 journal 記錄進行清理,則可使用兩種不同方式。

使用 –vacuum-size 選項

使用 –vacuum-time 選項

如果使用 –vacuum-size 選項,則可硬性指定紀錄檔的總體體積,意味著其會不斷刪除舊有記錄直到所占容量符合要求:

$ sudo journalctl --vacuum-size=1G

另一種方式則是使用 –vacuum-time 選項。任何早於這一時間點的條目都將被刪除。例如,去年之後的條目才能保留:

$ sudo journalctl --vacuum-time=1years

限定紀錄檔所能佔用的最高容量

我們可以通過 /etc/systemd/journald.conf 檔案來設定 systemd-journald 服務的行為。以下條目可用於限定紀錄檔資料可以佔用的最大儲存數量和紀錄檔資料體積的膨脹速度:

SystemMaxUse=:指定journal所能使用的最高持久儲存容量。

SystemKeepFree=:指定journal在新增新條目時需要保留的剩餘空間。

SystemMaxFileSize=:控制單一journal檔案大小,符合要求方可被轉為持久儲存。

RuntimeMaxUse=:指定易失性儲存中的最大可用磁碟容量(/run檔案系統之內)。

RuntimeKeepFree=:指定向易失性儲存內寫入資料時為其它應用保留的空間量(/run檔案系統之內)。

RuntimeMaxFileSize=:指定單一journal檔案可佔用的最大易失性儲存容量(/run檔案系統之內)。

通過設定上述值,大家可以控制 systemd-journald 服務對伺服器空間的消耗及保留方式。

檢視某次啟動後的紀錄檔

預設情況下 systemd-journald 服務只儲存本次啟動後的紀錄檔(重新啟動後丟掉以前的紀錄檔)。此時 -b 選項是沒啥用的。當我們把 systemd-journald 服務收集到的紀錄檔儲存到檔案中之後,就可以通過下面的命令檢視系統的重新啟動記錄:

$ journalctl --list-boots



此時我們就可以通過 -b 選項來選擇檢視某次執行過程中的紀錄檔:

$ sudo journalctl -b -1



$ sudo journalctl -b 9eaabbc25fe343999ef1024e6a16fb58

下面的命令都會輸出最後一次啟動後的紀錄檔資訊:

$ sudo journalctl -b

$ sudo 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 和時間條件,比如要過濾出某個時間段中 cron 服務的紀錄檔記錄:

$ sudo journalctl _SYSTEMD_UNIT=cron.service --since "2018-03-27" --until "2018-03-27 01:00"



按 unit 過濾紀錄檔

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

$ sudo journalctl -u nginx.service

$ sudo journalctl -u nginx.service --since today

還可以使用多個 -u 選項同時獲得多個 unit 的紀錄檔:

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

IT145.com E-mail:sddin#qq.com