JOURNALCTL(1)

NAME
journalctl - 檢索 systemd 日誌

SYNOPSIS

journalctl [OPTIONS...] [MATCHES...]

描述

journalctl 可用於檢索 systemd(1) 日誌(由 systemd-journald.service(8) 記錄)。

如果不帶任何引數直接呼叫此命令， 那麼將顯示所有日誌內容(從最早一條日誌記錄開始)。

如果指定了 [MATCHES...] 引數， 那麼輸出的日誌將會按照 [MATCHES...] 引數進行過濾。 MATCHE 必須符合 "FIELD=VALUE" 格式 (例如 "_SYSTEMD_UNIT=httpd.service" )， 參見 systemd.journal-fields(7) 手冊以瞭解日誌欄位的詳細介紹。 如果有多個不同的欄位被 [MATCHES...] 引數匹配， 那麼這些欄位之間使用"AND"邏輯連線， 也就是，日誌項必須同時滿足全部欄位的匹配條件才能被輸出。 如果同一個欄位被多個 [MATCHES...] 引數匹配， 那麼這些匹配條件之間使用"OR"邏輯連線， 也就是對於同一個欄位，日誌項只需滿足任意一個匹配條件即可輸出。 最後， "+" 字元可用作 [MATCHES...] 組之間的分隔符，並被視為使用"OR"邏輯連線。 也就是，MATCHE1 MATCHE2 + MATCHE3 MATCHE4 MATCHE5 + MATCHE6 MATCHE7 相當於 ( MATCHE1 MATCHE2 ) OR ( MATCHE3 MATCHE4 MATCHE5 ) OR ( MATCHE6 MATCHE7 )

還可以使用絕對路徑作為引數來過濾日誌。 絕對路徑可以是普通檔案，也可以是軟連線，但必須指向一個確實存在的檔案。 如果路徑指向了一個二進位制可執行檔案， 那麼它實際上相當於是一個對 "_EXE=" 欄位的匹配(僅匹配完整的絕對路徑)。 如果路徑指向了一個可執行指令碼， 那麼它實際上相當於是一個對 "_COMM=" 欄位的匹配(僅匹配指令碼的檔名)。 如果路徑指向了一個裝置節點， 那麼它實際上相當於是一個對 "_KERNEL_DEVICE=" 欄位的匹配(匹配該裝置及其所有父裝置的核心裝置名稱)。 在查詢時，軟連線會被追蹤到底，核心裝置名稱將被合成， 父裝置將按照當時的實際情況被提列出來。 因為日誌項一般並不包含標記實際物理裝置的欄位， 所以，裝置節點一般就是實際物理裝置的最佳代表。 但是又因為裝置節點與物理裝置之間的對應關係在系統重啟之後可能會發生變化， 所以，根據裝置節點過濾日誌僅對本次啟動有意義， 除非你能確認對應關係在重啟之後保持不變。

可以使用 --boot, --unit= 等選項 進一步附加額外的約束條件(相當於使用"AND"邏輯連線)。

最終的輸出結果來自所有可訪問的日誌檔案的綜合， 無論這些日誌檔案是否正在滾動或者正在被寫入， 也無論這些日誌檔案是屬於系統日誌還是使用者日誌， 只要有訪問許可權，就會被包括進來。

用於提取日誌的日誌檔案的集合可以使用 --user, --system, --directory, --file 選項進行篩選。

每個使用者都可以訪問其專屬的使用者日誌。 但是預設情況下， 只有root使用者以及 "systemd-journal", "adm", "wheel" 組中的使用者才可以訪問全部的日誌(系統與其他使用者)。 注意，一般發行版還會給 "adm" 與 "wheel" 組一些其他額外的特權。 例如 "wheel" 組的使用者一般都可以執行一些系統管理任務。

預設情況下，結果會透過 less 工具進行分頁輸出， 並且超長行會在螢幕邊緣被截斷。 不過，被截掉的部分可以透過左右箭頭按鍵檢視。 如果不想分頁輸出，那麼可以使用 --no-pager 選項，參見下面的"環境變數"小節。

如果是輸出到 tty 的話，行的顏色還會根據日誌的級別變化： ERROR 或更高級別為紅色，NOTICE 或更高級別為高亮，其他級別則正常顯示。

選項

能夠識別的命令列選項如下：

--no-full, --full, -l
    如果欄位內容超長則以省略號(...)截斷以適應列寬。 預設顯示完整的欄位內容(超長的部分換行顯示或者被分頁工具截斷)。

    老舊的 -l/--full 選項 僅用於撤銷已有的 --no-full 選項，除此之外沒有其他用處。

-a, --all
    完整顯示所有欄位內容， 即使其中包含不可列印字元或者欄位內容超長。

-f, --follow
    只顯示最新的日誌項，並且不斷顯示新生成的日誌項。 此選項隱含了 -n 選項。

-e, --pager-end
    在分頁工具內立即跳轉到日誌的尾部。 此選項隱含了 -n1000 以確保分頁工具不必快取太多的日誌行。 不過這個隱含的行數可以被明確設定的 -n 選項覆蓋。 注意，此選項僅可用於 less(1) 分頁器。

-n, --lines=
    限制顯示最新的日誌行數。 --pager-end 與 --follow 隱含了此選項。 此選項的引數：若為正整數則表示最大行數； 若為 "all" 則表示不限制行數； 若不設引數則表示預設值10行。

--no-tail
    顯示所有日誌行， 也就是用於撤銷已有的 --lines= 選項(即使與 -f 連用)。

-r, --reverse
    反轉日誌行的輸出順序， 也就是最先顯示最新的日誌。

-o, --output=
    控制日誌的輸出格式。 可以使用如下選項：

    short
        這是預設值， 其輸出格式與傳統的 syslog[1] 檔案的格式相似， 每條日誌一行。

    short-iso
        與 short 類似，只是將時間戳欄位以 ISO 8601 格式顯示。

    short-precise
        與 short 類似，只是將時間戳欄位的秒數精確到微秒級別。

    short-monotonic
        與 short 類似，只是將時間戳欄位的零值從核心啟動時開始計算。

    short-unix
        與 short 類似，只是將時間戳欄位顯示為從"UNIX時間原點"(1970-1-1 00:00:00 UTC)以來的秒數。 精確到微秒級別。

    verbose
        以結構化的格式顯示每條日誌的所有欄位。

    export
        將日誌序列化為二進位制位元組流(大部分依然是文字) 以適用於備份與網路傳輸(詳見 Journal Export Format[2] 文件)。

    json
        將日誌項按照JSON資料結構格式化， 每條日誌一行(詳見 Journal JSON Format[3] 文件)。

    json-pretty
        將日誌項按照JSON資料結構格式化， 但是每個欄位一行， 以便於人類閱讀。

    json-sse
        將日誌項按照JSON資料結構格式化，每條日誌一行，但是用大括號包圍， 以適應 Server-Sent Events[4] 的要求。

    cat
        僅顯示日誌的實際內容， 而不顯示與此日誌相關的任何後設資料(包括時間戳)。

--utc
    以世界統一時間(UTC)表示時間

--no-hostname
    不顯示來源於本機的日誌訊息的主機名欄位。 此選項僅對 short 系列輸出格式(見上文)有效。

-x, --catalog
    在日誌的輸出中增加一些解釋性的短文字， 以幫助進一步說明日誌的含義、 問題的解決方案、支援論壇、 開發文件、以及其他任何內容。 並非所有日誌都有這些額外的幫助文字， 詳見 Message Catalog Developer Documentation[5] 文件。

    注意，如果要將日誌輸出用於bug報告， 請不要使用此選項。

-q, --quiet
    當以普通使用者身份執行時， 不顯示任何警告資訊與提示資訊。 例如："-- Logs begin at ...", "-- Reboot --"

-m, --merge
    混合顯示包括遠端日誌在內的所有可見日誌。

-b [ID][±offset], --boot=[ID][±offset]
    顯示特定於某次啟動的日誌， 這相當於添加了一個 "_BOOT_ID=" 匹配條件。

    如果引數為空(也就是 ID 與 ±offset 都未指定)， 則表示僅顯示本次啟動的日誌。

    如果省略了 ID ， 那麼當 ±offset 是正數的時候， 將從日誌頭開始正向查詢， 否則(也就是為負數或零)將從日誌尾開始反響查詢。 舉例來說， "-b 1"表示按時間順序排列最早的那次啟動， "-b 2"則表示在時間上第二早的那次啟動； "-b -0"表示最後一次啟動， "-b -1"表示在時間上第二近的那次啟動， 以此類推。 如果 ±offset 也省略了， 那麼相當於"-b -0"， 除非本次啟動不是最後一次啟動(例如用 --directory 指定了另外一臺主機上的日誌目錄)。

    如果指定了32字元的 ID ， 那麼表示以此 ID 所代表的那次啟動為基準 計算偏移量(±offset)， 計算方法同上。 換句話說， 省略 ID 表示以本次啟動為基準 計算偏移量(±offset)。

--list-boots
    列出每次啟動的 序號(也就是相對於本次啟動的偏移量)、32字元的ID、 第一條日誌的時間戳、最後一條日誌的時間戳。

-k, --dmesg
    僅顯示核心日誌。隱含了 -b 選項以及 "_TRANSPORT=kernel" 匹配項。

-t, --identifier=SYSLOG_IDENTIFIER
    僅顯示 syslog[1] 識別符為 SYSLOG_IDENTIFIER 的日誌項。

    可以多次使用該選項以指定多個識別符。

-u, --unit=UNIT|PATTERN
    僅顯示屬於特定單元的日誌。 也就是單元名稱正好等於 UNIT 或者符合 PATTERN 模式的單元。 這相當於添加了一個 "_SYSTEMD_UNIT=UNIT" 匹配項(對於 UNIT 來說)， 或一組匹配項(對於 PATTERN 來說)。

    可以多次使用此選項以新增多個並列的匹配條件(相當於用"OR"邏輯連線)。

--user-unit=
    僅顯示屬於特定使用者會話單元的日誌。 相當於同時添加了 "_SYSTEMD_USER_UNIT=" 與 "_UID=" 兩個匹配條件。

    可以多次使用此選項以新增多個並列的匹配條件(相當於用"OR"邏輯連線)。

-p, --priority=
    根據日誌等級(包括等級範圍)過濾輸出結果。 日誌等級數字與其名稱之間的對應關係如下 (參見 syslog(3))： "emerg" (0), "alert" (1), "crit" (2), "err" (3), "warning" (4), "notice" (5), "info" (6), "debug" (7) 。 若設為一個單獨的數字或日誌等級名稱， 則表示僅顯示小於或等於此等級的日誌 (也就是重要程度等於或高於此等級的日誌)。 若使用 FROM..TO.. 設定一個範圍， 則表示僅顯示指定的等級範圍內(含兩端)的日誌。 此選項相當於添加了 "PRIORITY=" 匹配條件。

-c, --cursor=
    從指定的遊標(cursor)開始顯示日誌。 [提示]每條日誌都有一個"__CURSOR"欄位，類似於該條日誌的指紋。

--after-cursor=
    從指定的遊標(cursor)之後開始顯示日誌。 如果使用了 --show-cursor 選項， 則也會顯示遊標本身。

--show-cursor
    在最後一條日誌之後顯示遊標， 類似下面這樣，以"--"開頭：

        -- cursor: s=0639...

    遊標的具體格式是私有的(也就是沒有公開的規範)， 並且會變化。

-S, --since=, -U, --until=
    顯示晚於指定時間(--since=)的日誌、顯示早於指定時間(--until=)的日誌。 引數的格式類似 "2012-10-30 18:17:16" 這樣。 如果省略了"時:分:秒"部分， 則相當於設為 "00:00:00" 。 如果僅省略了"秒"的部分則相當於設為 ":00" 。 如果省略了"年-月-日"部分， 則相當於設為當前日期。 除了"年-月-日 時:分:秒"格式， 引數還可以進行如下設定： (1)設為 "yesterday", "today", "tomorrow" 以表示那一天的零點(00:00:00)。 (2)設為 "now" 以表示當前時間。 (3)可以在"年-月-日 時:分:秒"前加上 "-"(前移) 或 "+"(後移) 字首以表示相對於當前時間的偏移。 關於時間與日期的詳細規範， 參見 systemd.time(7)

-F, --field=
    顯示所有日誌中某個欄位的所有可能值。 [譯者注]類似於SQL語句："SELECT DISTINCT 某欄位 FROM 全部日誌"

-N, --fields
    輸出所有日誌欄位的名稱

--system, --user
    僅顯示系統服務與核心的日誌(--system)、 僅顯示當前使用者的日誌(--user)。 如果兩個選項都未指定，則顯示當前使用者的所有可見日誌。

-M, --machine=
    顯示來自於正在執行的、特定名稱的本地容器的日誌。 引數必須是一個本地容器的名稱。

-D DIR, --directory=DIR
    僅顯示來自於特定目錄中的日誌， 而不是預設的執行時和系統日誌目錄中的日誌。

--file=GLOB
    GLOB 是一個可以包含"?"與"*"的檔案路徑匹配模式。 表示僅顯示來自與指定的 GLOB 模式匹配的檔案中的日誌， 而不是預設的執行時和系統日誌目錄中的日誌。 可以多次使用此選項以指定多個匹配模式(多個模式之間用"OR"邏輯連線)。

--root=ROOT
    在對日誌進行操作時， 將 ROOT 視為系統的根目錄。 例如 --update-catalog 將會建立 ROOT/var/lib/systemd/catalog/database

--new-id128
    此選項並不用於顯示日誌內容， 而是用於重新生成一個標識日誌分類的 128-bit ID 。 此選項的目的在於 幫助開發者生成易於辨別的日誌訊息， 以方便除錯。

--header
    此選項並不用於顯示日誌內容， 而是用於顯示日誌檔案內部的頭資訊(類似於後設資料)。

--disk-usage
    此選項並不用於顯示日誌內容， 而是用於顯示所有日誌檔案(歸檔檔案與活動檔案)的磁碟佔用總量。

--vacuum-size=, --vacuum-time=, --vacuum-files=
    這些選項並不用於顯示日誌內容， 而是用於清理日誌歸檔檔案(並不清理活動的日誌檔案)， 以釋放磁碟空間。 --vacuum-size= 可用於限制歸檔檔案的最大磁碟使用量 (可以使用 "K", "M", "G", "T" 字尾)； --vacuum-time= 可用於清除指定時間之前的歸檔 (可以使用 "s", "m", "h", "days", "weeks", "months", "years" 字尾)； --vacuum-files= 可用於限制日誌歸檔檔案的最大數量。 注意，--vacuum-size= 對 --disk-usage 的輸出僅有間接效果， 因為 --disk-usage 輸出的是歸檔日誌與活動日誌的總量。 同樣，--vacuum-files= 也未必一定會減少日誌檔案的總數， 因為它同樣僅作用於歸檔檔案而不會刪除活動的日誌檔案。 此三個選項可以同時使用，以同時從三個維度去限制歸檔檔案。 若將某選項設為零，則表示取消此選項的限制。

--list-catalog [128-bit-ID...]
    簡要列出日誌分類資訊， 其中包括對分類資訊的簡要描述。

    如果明確指定了分類ID(128-bit-ID)， 那麼僅顯示指定的分類。

--dump-catalog [128-bit-ID...]
    詳細列出日誌分類資訊 (格式與 .catalog 檔案相同)。

    如果明確指定了分類ID(128-bit-ID)， 那麼僅顯示指定的分類。

--update-catalog
    更新日誌分類索引二進位制檔案。 每當安裝、刪除、更新了分類檔案，都需要執行一次此動作。

--setup-keys
    此選項並不用於顯示日誌內容， 而是用於生成一個新的FSS(Forward Secure Sealing)金鑰對。 此金鑰對包含一個"sealing key"與一個"verification key"。 "sealing key"儲存在本地日誌目錄中， 而"verification key"則必須儲存在其他地方。 詳見 journald.conf(5) 中的 Seal= 選項。

--force
    與 --setup-keys 連用， 表示即使已經配置了FSS(Forward Secure Sealing)金鑰對， 也要強制重新生成。

--interval=
    與 --setup-keys 連用，指定"sealing key"的變化間隔。 較短的時間間隔會導致佔用更多的CPU資源， 但是能夠減少未檢測的日誌變化時間。 預設值是 15min

--verify
    檢查日誌檔案的內在一致性。 如果日誌檔案在生成時開啟了FSS特性， 並且使用 --verify-key= 指定了FSS的"verification key"， 那麼，同時還將驗證日誌檔案的真實性。

--verify-key=
    與 --verify 選項連用， 指定FSS的"verification key"

--sync
    要求日誌守護程序將所有未寫入磁碟的日誌資料刷寫到磁碟上， 並且一直阻塞到刷寫操作實際完成之後才返回。 因此該命令可以保證當它返回的時候， 所有在呼叫此命令的時間點之前的日誌， 已經全部安全的刷寫到了磁碟中。

--flush
    要求日誌守護程序 將 /run/log/journal 中的日誌資料 刷寫到 /var/log/journal 中 (如果持久儲存裝置當前可用的話)。 此操作會一直阻塞到操作完成之後才會返回， 因此可以確保在該命令返回時， 資料轉移確實已經完成。 注意，此命令僅執行一個單獨的、一次性的轉移動作， 若沒有資料需要轉移， 則此命令什麼也不做， 並且也會返回一個表示操作已正確完成的返回值。

--rotate
    要求日誌守護程序滾動日誌檔案。 此命令會一直阻塞到滾動完成之後才會返回。

-h, --help
    顯示簡短的幫助資訊並退出。

--version
    顯示簡短的版本資訊並退出。

--no-pager
    不將程式的輸出內容管道(pipe)給分頁程式。

退出狀態

返回值為 0 表示成功， 非零返回值表示失敗程式碼。

環境變數

$SYSTEMD_PAGER
    指定分頁程式。僅在未指定 --no-pager 選項時有意義。 此變數會覆蓋 $PAGER 的值。 將此變數設為空字串或 "cat" 等價於使用 --no-pager 選項。

$SYSTEMD_LESS
    用於覆蓋 預設傳遞給 less 程式的命令列選項 ("FRSXMK")。

例子

不帶任何選項與引數，表示顯示全部日誌

    journalctl

僅指定一個匹配條件， 顯示所有符合該匹配條件的日誌

    journalctl _SYSTEMD_UNIT=avahi-daemon.service

指定了兩個不同欄位的匹配條件， 顯示同時滿足兩個匹配條件的日誌

    journalctl _SYSTEMD_UNIT=avahi-daemon.service _PID=28097

指定了同一個欄位的兩個不同匹配條件， 顯示滿足其中任意一個條件的日誌

    journalctl _SYSTEMD_UNIT=avahi-daemon.service _SYSTEMD_UNIT=dbus.service

使用 "+" 連線兩組匹配條件， 相當於邏輯"OR"連線

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

顯示所有 D-Bus 程序產生的日誌

    journalctl /usr/bin/dbus-daemon

顯示上一次啟動所產生的所有核心日誌

    journalctl -k -b -1

持續顯示 apache.service 服務不斷生成的日誌

    journalctl -f -u apache

參見

systemd(1), systemd-journald.service(8), systemctl(1), coredumpctl(1), systemd.journal-fields(7), journald.conf(5), systemd.time(7)

NOTES

1.  syslog
    //linux/sysklogd.html

2.  Journal Export Format
    http://www.freedesktop.org/wiki/Software/systemd/export

3.  Journal JSON Format
    http://www.freedesktop.org/wiki/Software/systemd/json

4.  Server-Sent Events
    https://developer.mozilla.org/en-US/docs/Server-sent_events/Using_server-sent_events

5.  Message Catalog Developer Documentation
    http://www.freedesktop.org/wiki/Software/systemd/catalog

跋
本頁面中文版由中文 man 手冊頁計劃提供。

翻譯人員：金步國
金步國作品集：http://www.jinbuguo.com
中文 man 手冊頁計劃：https://github.com/man-pages-zh/manpages-zh