
journalctl:查詢 systemd 日誌
systemd 取代 SUSE Linux Enterprise 12 中的傳統 init 程序檔後 (請參閱第 14 章 「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
[...]
依預設,日誌在 /run/log/journal/ 中儲存記錄資料。由於 /run/ 目錄具有易失本性,因此,在重新開機時會遺失記錄資料。若要永久儲存記錄資料,/var/log/journal/ 目錄必須存在且具有正確的擁有權和許可權,如此,systemd-journald 服務便可在其中儲存其資料。systemd 將為您建立該目錄,如果您執行以下操作,它將會切換到永久記錄:
以 root 身分開啟 /etc/systemd/journald.conf 進行編輯。
# vi /etc/systemd/journald.conf
取消註解包含 Storage= 的行,並將它變更為
[...] [Journal] Storage=persistent #Compress=yes [...]
儲存該檔案,然後重新啟動 systemd-journald:
systemctl restart systemd-journald
journalctl 的有用參數 #
本節介紹了一些可用來增強 journalctl 預設行為的常見有用選項。journalctl 手冊頁 man 1 journalctl 中介紹了所有參數。
若要顯示與特定可執行檔相關的所有日誌訊息,請指定該可執行檔的完整路徑:
journalctl /usr/lib/systemd/systemd
只顯示最近的日誌訊息,另外,在將新的記錄項目新增到日誌時會列印這些新項目。
列印訊息並跳轉到日誌末尾,以便在頁面巡覽區中顯示最新的項目。
以反向順序列印記錄訊息,使最新的項目列在最前面。
只顯示核心訊息。這等同於欄位比對 _TRANSPORT=kernel (請參閱第 15.3.3 節 「依據欄位過濾」)。
只顯示指定 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.
如果不結合任何參數呼叫 journalctl,它將顯示日誌的完整內容,最舊的項目列在最前面。可按特定的參數和欄位過濾輸出。
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
可透過指定開始日期和/或結束日期來過濾 journalctl 的輸出。日期規格應採用「2014-06-30 9:17:16」這樣的格式。如果省略時間部分,則會假設為午夜。如果省略秒,則會假設為「:00」。如果省略日期部分,則會假設為目前日期。您也可以不採用數字表示法,而是指定關鍵字「yesterday」、「today」或「tomorrow」,分別表示當日前一天、當日或者當日後一天的午夜。如果指定「now」,則表示目前時間。您還可以指定以 - 或 + 為字首的相對時間,分別表示目前時間之前或之後的特定時間。
僅顯示從現在開始產生的新訊息,並持續更新輸出:
# journalctl --since "now" -f
顯示從昨天午夜到 3:20AM 的所有訊息:
# journalctl --since "today" --until "3:20"
您可以按特定的欄位過濾日誌輸出。要比對的欄位語法為 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
systemd 錯誤 #
本節將介紹一個簡單的範例,說明如何找出並修復 systemd 在 apache2 啟動期間報告的錯誤。
嘗試啟動 apache2 服務:
# systemctl start apache2 Job for apache2.service failed. See 'systemctl status apache2' and 'journalctl -xn' for details.
我們來看看該服務的狀態如何:
# 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。
顯示與程序 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 [...]
改正 /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 [...]
可透過修改 /etc/systemd/journald.conf 來調整 systemd-journald 服務的行為。本節只介紹基本的選項設定。如需完整的檔案描述,請參閱 man 5 journald.conf。請注意,若要使變更生效,必須使用以下指令重新啟動日誌
# systemctl restart systemd-journald
如果將日誌記錄資料儲存到永久位置 (請參閱第 15.1 節 「將日誌設為永久」),這些資料最多可佔用 /var/log/journal 所在檔案系統空間的 10%。例如,如果 /var/log/journal 位於一個 30 GB 的 /var 分割區中,則日誌最多可佔用 3 GB 磁碟空間。若要變更此限制,請變更 (並取消註解) SystemMaxUse 選項:
SystemMaxUse=50M
/dev/ttyX #
您可以將日誌轉遞到終端機裝置,以便在偏好的終端機螢幕 (例如 /dev/tty12) 上顯式相關的系統訊息。將以下 journald 選項變更為
ForwardToConsole=yes TTYPath=/dev/tty12
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