跳至內容跳至頁面導覽:上一頁 [access key p]/下一頁 [access key n]
documentation.suse.com / SUSE Linux Enterprise Server 文件 / 管理指南 / 系統 / journalctl:查詢 systemd 日誌
適用範圍 SUSE Linux Enterprise Server 15 SP3

17 journalctl:查詢 systemd 日誌

systemd 具有自己的記錄系統,稱作日誌。由於所有系統事件都會寫入日誌,因此不需要執行基於 syslog 的服務。

日誌本身是 systemd 管理的系統服務,完整名稱為 systemd-journald.service。它會根據從核心、使用者程序、標準輸入和系統服務錯誤收到的記錄資訊,維護結構化的索引日誌,藉以收集和儲存記錄資料。systemd-journald 服務預設處於開啟狀態。

tux > sudo systemctl status systemd-journald
systemd-journald.service - Journal Service
   Loaded: loaded (/usr/lib/systemd/system/systemd-journald.service; static)
   Active: active (running) since Mon 2014-05-26 08:36:59 EDT; 3 days ago
     Docs: man:systemd-journald.service(8)
           man:journald.conf(5)
 Main PID: 413 (systemd-journal)
   Status: "Processing requests..."
   CGroup: /system.slice/systemd-journald.service
           └─413 /usr/lib/systemd/systemd-journald
[...]

17.1 將日誌設為永久

依預設,日誌在 /run/log/journal/ 中儲存記錄資料。由於 /run/ 目錄具有易失本性,因此,在重新開機時會遺失記錄資料。若要永久儲存記錄資料,/var/log/journal/ 目錄必須存在且具有正確的擁有權和權限,使 systemd-journald 服務能夠儲存其資料。systemd 將為您建立該目錄,如果您執行以下操作,它將會切換到永久記錄:

  1. root 身分開啟 /etc/systemd/journald.conf 進行編輯。

    root # vi /etc/systemd/journald.conf
  2. 取消註解包含 Storage= 的行,並將它變更為

    [...]
    [Journal]
    Storage=persistent
    #Compress=yes
    [...]
  3. 儲存該檔案,然後重新啟動 systemd-journald:

    root # systemctl restart systemd-journald

17.2 journalctl:實用參數

本節介紹了一些可用來增強 journalctl 預設行為的常見有用選項。journalctl 手冊頁 man 1 journalctl 中介紹了所有參數。

提示
提示:與特定可執行檔相關的訊息

若要顯示與特定可執行檔相關的所有日誌訊息,請指定該可執行檔的完整路徑:

tux > sudo journalctl /usr/lib/systemd/systemd
-f

只顯示最近的日誌訊息,另外,在將新的記錄項目新增到日誌時會列印這些新項目。

列印訊息並跳轉到日誌末尾,以便在頁面巡覽區中顯示最新的項目。

-r

以反向順序列印日誌訊息,使最新的項目列在最前面。

-k

只顯示核心訊息。這等同於欄位比對 _TRANSPORT=kernel (請參閱第 17.3.3 節 「依據欄位過濾」)。

-u

只顯示指定 systemd 單元的訊息。這等同於欄位比對 _SYSTEMD_UNIT=UNIT (請參閱第 17.3.3 節 「依據欄位過濾」)。

tux > sudo journalctl -u apache2
[...]
Jun 03 10:07:11 pinkiepie systemd[1]: Starting The Apache Webserver...
Jun 03 10:07:12 pinkiepie systemd[1]: Started The Apache Webserver.

17.3 過濾日誌輸出

如果不結合任何參數呼叫 journalctl,它將顯示日誌的完整內容,最舊的項目列在最前面。可按特定的參數和欄位過濾輸出。

17.3.1 依據開機編號過濾

journalctl 可以依據特定的系統開機編號過濾訊息。若要列出所有可用的開機,請執行

tux > sudo journalctl --list-boots
-1 097ed2cd99124a2391d2cffab1b566f0 Mon 2014-05-26 08:36:56 EDT—Fri 2014-05-30 05:33:44 EDT
 0 156019a44a774a0bb0148a92df4af81b Fri 2014-05-30 05:34:09 EDT—Fri 2014-05-30 06:15:01 EDT

第一欄列出開機偏移:0 表示目前的開機,-1 表示上一次開機,-2 表示再上一次的開機,依此類推。第二欄包含開機 ID,其後是特定開機的限制時間戳記。

顯示目前開機中的所有訊息:

tux > sudo journalctl -b

如果需要查看上一次開機的日誌訊息,請新增一個偏移參數。下面的範例將輸出上一次開機的訊息:

tux > sudo journalctl -b -1

另一種方法是依據開機 ID 列出開機訊息。要實現此目的,請使用 _BOOT_ID 欄位:

tux > sudo journalctl _BOOT_ID=156019a44a774a0bb0148a92df4af81b

17.3.2 依據時間間隔過濾

可透過指定開始日期和/或結束日期來過濾 journalctl 的輸出。日期規格應採用「2014-06-30 9:17:16」這樣的格式。如果省略時間部分,則會假設為午夜。如果省略秒,則會假設為「:00」。如果省略日期部分,則會假設為目前日期。您也可以不採用數字表示法,而是指定關鍵字「yesterday」、「today」或「tomorrow」。它們表示當日前一天、當日或者當日後一天的午夜。如果指定「now」,則表示目前時間。您還可以指定以 -+ 為字首的相對時間,分別表示目前時間之前或之後的特定時間。

僅顯示從現在開始產生的新訊息,並持續更新輸出:

tux > sudo journalctl --since "now" -f

顯示從昨天午夜到 3:20AM 的所有訊息:

tux > sudo journalctl --since "today" --until "3:20"

17.3.3 依據欄位過濾

您可以按特定的欄位過濾日誌輸出。要比對的欄位語法為 FIELD_NAME=MATCHED_VALUE,例如 _SYSTEMD_UNIT=httpd.service。您可以在單個查詢中指定多個比對條件,以更精確地過濾輸出訊息。如需預設欄位的清單,請參閱 man 7 systemd.journal-fields

顯示特定程序 ID 產生的訊息:

tux > sudo journalctl _PID=1039

顯示屬於特定使用者 ID 的訊息:

# journalctl _UID=1000

顯示來自核心環緩衝區的訊息 (與 dmesg 產生的結果相同):

tux > sudo journalctl _TRANSPORT=kernel

顯示來自服務之標準輸出或錯誤輸出的訊息:

tux > sudo journalctl _TRANSPORT=stdout

僅顯示指定服務產生的訊息:

tux > sudo journalctl _SYSTEMD_UNIT=avahi-daemon.service

如果指定了兩個不同的欄位,則僅顯示同時與兩個運算式相符的項目:

tux > sudo journalctl _SYSTEMD_UNIT=avahi-daemon.service _PID=1488

如果兩個比對參考了同一個欄位,則顯示與兩個運算式中任意一個相符的所有項目:

tux > sudo journalctl _SYSTEMD_UNIT=avahi-daemon.service _SYSTEMD_UNIT=dbus.service

可以使用「+」分隔符將兩個運算式組合成一個邏輯「OR」。下面的範例將顯示來自程序 ID 為 1480 之 Avahi 服務程序的所有訊息,以及來自 D-Bus 服務的所有訊息:

tux > sudo journalctl _SYSTEMD_UNIT=avahi-daemon.service _PID=1480 + _SYSTEMD_UNIT=dbus.service

17.4 調查 systemd 錯誤

本節將介紹一個簡單的範例,說明如何找出並修復 systemdapache2 啟動期間報告的錯誤。

  1. 嘗試啟動 apache2 服務:

    # systemctl start apache2
    Job for apache2.service failed. See 'systemctl status apache2' and 'journalctl -xn' for details.
  2. 我們來看看該服務的狀態如何:

    tux > sudo systemctl status apache2
    apache2.service - The Apache Webserver
       Loaded: loaded (/usr/lib/systemd/system/apache2.service; disabled)
       Active: failed (Result: exit-code) since Tue 2014-06-03 11:08:13 CEST; 7min ago
      Process: 11026 ExecStop=/usr/sbin/start_apache2 -D SYSTEMD -DFOREGROUND \
               -k graceful-stop (code=exited, status=1/FAILURE)

    導致錯誤的程序 ID 為 11026。

  3. 顯示與程序 ID 11026 相關的詳細訊息:

    tux > sudo journalctl -o verbose _PID=11026
    [...]
    MESSAGE=AH00526: Syntax error on line 6 of /etc/apache2/default-server.conf:
    [...]
    MESSAGE=Invalid command 'DocumenttRoot', perhaps misspelled or defined by a module
    [...]
  4. 改正 /etc/apache2/default-server.conf 中的錯字,啟動 apache2 服務,然後列印其狀態:

    tux > sudo systemctl start apache2 && systemctl status apache2
    apache2.service - The Apache Webserver
       Loaded: loaded (/usr/lib/systemd/system/apache2.service; disabled)
       Active: active (running) since Tue 2014-06-03 11:26:24 CEST; 4ms ago
      Process: 11026 ExecStop=/usr/sbin/start_apache2 -D SYSTEMD -DFOREGROUND
               -k graceful-stop (code=exited, status=1/FAILURE)
     Main PID: 11263 (httpd2-prefork)
       Status: "Processing requests..."
       CGroup: /system.slice/apache2.service
               ├─11263 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -D [...]
               ├─11280 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -D [...]
               ├─11281 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -D [...]
               ├─11282 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -D [...]
               ├─11283 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -D [...]
               └─11285 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -D [...]

17.5 Journald 組態

可透過修改 /etc/systemd/journald.conf 來調整 systemd-journald 服務的行為。本節只介紹基本的選項設定。如需完整的檔案描述,請參閱 man 5 journald.conf。請注意,若要使變更生效,必須使用以下指令重新啟動日誌

tux > sudo systemctl restart systemd-journald

17.5.1 變更日誌大小限制

如果將日誌記錄資料儲存到永久位置 (請參閱第 17.1 節 「將日誌設為永久」),這些資料最多可佔用 /var/log/journal 所在檔案系統空間的 10%。例如,如果 /var/log/journal 位於一個 30 GB 的 /var 分割區中,則日誌最多可佔用 3 GB 磁碟空間。若要變更此限制,請變更 (並取消註解) SystemMaxUse 選項:

SystemMaxUse=50M

17.5.2 將日誌轉遞到 /dev/ttyX

您可以將日誌轉遞到終端機裝置,以便在偏好的終端機螢幕 (例如 /dev/tty12) 上顯式相關的系統訊息。將以下 journald 選項變更為

ForwardToConsole=yes
TTYPath=/dev/tty12

17.5.3 將日誌轉遞到 syslog 工具

Journald 與傳統的 syslog 實作 (例如 rsyslog) 回溯相容。請務必滿足以下條件:

  • 已安裝 rsyslog。

    tux > sudo rpm -q rsyslog
    rsyslog-7.4.8-2.16.x86_64
  • 已啟用 rsyslog 服務。

    tux > sudo systemctl is-enabled rsyslog
    enabled
  • 已在 /etc/systemd/journald.conf 中啟用轉遞至 syslog。

    ForwardToSyslog=yes

17.6 使用 YaST 過濾 systemd 日誌

過濾 systemd 日誌的簡單方法 (無需處理 journalctl 語法) 是使用 YaST 日誌模組。使用 sudo zypper in yast2-journal 安裝該模組後,請在 YaST 中選取 系統 ›  Systemd 日誌 啟動該模組。也可以在指令行中輸入 sudo yast2 journal 來啟動該模組。

YaST systemd 日誌
圖 17.1︰ YaST systemd 日誌

模組將在表中顯示記錄項目。使用頂部的搜尋方塊可以搜尋包含特定字元的項目,這類似於使用 grep。若要依日期和時間、單位、檔案或優先程度過濾項目,請按一下變更過濾器,然後設定相應的選項。

17.7 在 GNOME 中檢視記錄

您可以使用 GNOME 記錄來檢視日誌。可從應用程式功能表啟動它。若要檢視系統記錄訊息,需要以 root 身分執行,例如使用 xdg-su gnome-logs。按 AltF2 時可執行此指令。