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

15 journalctl︰查詢 systemd 日誌

systemd 取代 SUSE Linux Enterprise 12 中的傳統 init 程序檔後 (請參閱第 13 章 「systemd 精靈),引入了自身的記錄系統日誌。由於所有系統事件都將寫入到日誌中,因此,使用者不再需要執行基於 syslog 的服務。

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

# 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
[...]

15.1 將日誌設為永久

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

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

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

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

    systemctl restart systemd-journald

15.2 journalctl 的有用參數

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

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

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

journalctl /usr/lib/systemd/systemd
-f

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

-e

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

-r

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

-k

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

-u

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

# 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.

15.3 過濾日誌輸出

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

15.3.1 依據開機編號過濾

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

# 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,其後是特定開機的限制時間戳記。

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

# journalctl -b

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

# journalctl -b -1

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

# journalctl _BOOT_ID=156019a44a774a0bb0148a92df4af81b

15.3.2 依據時間間隔過濾

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

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

# journalctl --since "now" -f

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

# journalctl --since "today" --until "3:20"

15.3.3 依據欄位過濾

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

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

# journalctl _PID=1039

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

# journalctl _UID=1000

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

# journalctl _TRANSPORT=kernel

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

# journalctl _TRANSPORT=stdout

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

# journalctl _SYSTEMD_UNIT=avahi-daemon.service

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

# journalctl _SYSTEMD_UNIT=avahi-daemon.service _PID=1488

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

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

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

# journalctl _SYSTEMD_UNIT=avahi-daemon.service _PID=1480 + _SYSTEMD_UNIT=dbus.service

15.4 調查 systemd 錯誤

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

  1. 嘗試啟動 apache2 服務︰

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

    # 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 相關的詳細訊息︰

    # 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 服務,然後列印其狀態︰

    # 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 [...]

15.5 Journald 組態

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

# systemctl restart systemd-journald

15.5.1 變更日誌大小限制

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

SystemMaxUse=50M

15.5.2 將日誌轉遞到 /dev/ttyX

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

ForwardToConsole=yes
TTYPath=/dev/tty12

15.5.3 將日誌轉遞到 Syslog 工具

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

  • 已安裝 rsyslog。

    # rpm -q rsyslog
    rsyslog-7.4.8-2.16.x86_64
  • 已啟用 rsyslog 服務。

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

    ForwardToSyslog=yes

15.6 使用 YaST 過濾 systemd 記錄

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

YaST systemd 記錄
圖 15.1︰ YaST systemd 記錄

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