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
將為您建立該目錄,如果您執行以下操作,它將會切換到永久記錄:
以
root
身分開啟/etc/systemd/journald.conf
進行編輯。root #
vi /etc/systemd/journald.conf取消註解包含
Storage=
的行,並將它變更為[...] [Journal] Storage=persistent #Compress=yes [...]
儲存該檔案,然後重新啟動 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
錯誤 #
本節將介紹一個簡單的範例,說明如何找出並修復 systemd
在 apache2
啟動期間報告的錯誤。
嘗試啟動 apache2 服務:
# systemctl start apache2 Job for apache2.service failed. See 'systemctl status apache2' and 'journalctl -xn' for details.
我們來看看該服務的狀態如何:
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。
顯示與程序 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 [...]改正
/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 中選取 › 啟動該模組。也可以在指令行中輸入 sudo yast2 journal
來啟動該模組。
模組將在表中顯示記錄項目。使用頂部的搜尋方塊可以搜尋包含特定字元的項目,這類似於使用 grep
。若要依日期和時間、單位、檔案或優先程度過濾項目,請按一下 ,然後設定相應的選項。
17.7 在 GNOME 中檢視記錄 #
您可以使用 GNOME 記錄來檢視日誌。可從應用程式功能表啟動它。若要檢視系統記錄訊息,需要以 root 身分執行,例如使用 xdg-su gnome-logs
。按 Alt–F2 時可執行此指令。