linux journalctl 命令


目錄

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

通過日志級別進行過濾

除了通過 PRIORITY= 的方式,還可以通過 -p 選項來過濾日志的級別。 可以指定的優先級如下:
# 0: emerg
# 1: alert
# 2: crit
# 3: err
# 4: warning
# 5: notice
# 6: info
# 7: debug

$ sudo journalctl -p err

注意,這里指定的是優先級的名稱。

實時更新日志

與 tail -f 類似,journalctl 支持 -f 選項來顯示實時的日志:

$ sudo journalctl -f

如果要查看某個 unit 的實時日志,再加上 -u 選項就可以了:

$ sudo journalctl -f -u prometheus.service

只顯示最新的 n 行

命令行選項 -n 用來控制只顯示最新的 n 行日志,默認是顯示尾部的最新 10 行日志:

$ sudo journalctl -n

也可以顯示尾部指定行數的日志:

$ sudo journalctl -n 20

下面則是顯示 cron.service 服務最新的三行日志:

$ journalctl -u cron.service -n 3

控制輸出

把結果重定向到標准輸出
默認情況下,journalctl 會在 pager 內顯示輸出結果。如果大家希望利用文本操作工具對數據進行處理,則需要使用標准輸出。在這種情況下,我們需要使用 --no-pager 選項。

$ sudo journalctl --no-pager

這樣就可以把結果重定向到我們需要的地方(一般是磁盤文件或者是文本工具)。

格式化輸出的結果
如果大家需要對日志記錄進行處理,可能需要使用更易使用的格式以簡化數據解析工作。幸運的是,journalctl 能夠以多種格式進行顯示,只須添加 -o 選項即可。-o 選項支持的類型如下:
    short
       這是默認的格式,即經典的 syslog 輸出格式。
    short-iso
       與 short 類似,強調 ISO 8601 時間戳。
    short-precise
       與 short 類似,提供微秒級精度。
    short-monotonic
       與 short 類似,強調普通時間戳。
    verbose
       顯示全部字段,包括通常被內部隱藏的字段。
    export
       適合傳輸或備份的二進制格式。
    json
       標准 json 格式,每行一條記錄。
    json-pretty
       適合閱讀的 json 格式。
    json-sse
       經過包裝可以兼容 server-sent 事件的 json 格式。
    cat
       只顯示信息字段本身。

比如我們要以 json 格式輸出 cron.service 的最后一條日志:

$ sudo journalctl -u cron.service -n 1 --no-pager -o json

而 json-pretty 的格式為:

按可執行文件的路徑過濾

如果在參數中指定某個可執行文件(二進制文件或腳本文件),則 journalctl 會顯示與該可執行文件相關的全部條目。比如可以顯示 /usr/lib/systemd/systemd 程序產生的日志:

$ sudo journalctl /usr/lib/systemd/systemd

也可以顯示 /usr/bin/bash 程序產生的日志:

$ sudo journalctl /usr/bin/bash

查看內核日志

如果我們需要查看內核日志,可以指定 -k 選項,這樣輸出的結果中就只有內核日志了。-k 選項是通過 -b 選項加上匹配條件 "_TRANSPORT=kernel" 實現的。下面是基本的用法:

$ sudo journalctl -k

總結

進入 systemd 時代后,查看日志的方式也發生了變化,原因是 systemd 自帶了日志管理服務和工具。單就日志的查看來說,我們需要使用 journalctl 工具。它的好處是使用一個統一的工具來完成日志的查看功能,我們不用記很多的命令了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM