journalctl 日誌查詢:找出系統問題的關鍵工具
在現代 Linux 發行版中,systemd 已經成為標準的初始系統和服務管理器。隨著 systemd 的普及,傳統的 /var/log/syslog 或 /var/log/messages 檔案逐漸被 journald 取代。journalctl 作為查詢這些二進制日誌的主要工具,功能強大且靈活。對於系統管理員而言,熟練掌握 journalctl 是快速診斷系統異常、服務崩潰或啟動失敗的關鍵技能。
這篇文章將深入解析 journalctl 的核心用法,並提供在 Ubuntu 22.04 與 Debian 12 上實用的操作範例。
基礎查詢與即時監控
最基礎的用法是直接執行 journalctl,它會預設顯示所有日誌訊息,從舊到新排列。由於日誌量可能非常龐大,我們通常會搭配 --no-pager 參數來避免分頁器(pager)干擾輸出,或者使用 less 進行瀏覽。
# 查看所有日誌,並透過 less 分頁瀏覽
sudo journalctl --no-pager | less
若你想即時觀察系統發生的新事件(類似 tail -f),可以使用 -f 參數。這在偵測服務啟動過程中的錯誤時極具幫助。
# 即時監控日誌更新
sudo journalctl -f
依據時間過濾:快速定位問題
系統出錯時,你通常只知道問題發生的大概時間。journalctl 提供了強大的時間過濾選項,讓你能精確鎖定故障發生時的日誌。
# 查看今天的所有日誌
sudo journalctl --since today
# 查看昨天下午 2 點到 3 點之間的日誌
sudo journalctl --since "14:00:00" --until "15:00:00"
# 查看最近 1 小時的日誌
sudo journalctl --since "1 hour ago"
# 查看最近 1 天內的重啟記錄
sudo journalctl --since "1 day ago" --until "now"
依據服務或單元過濾
當你需要排查特定服務(如 nginx、sshd 或 docker)的問題時,可以使用 -u 參數指定單元名稱。這能大幅減少噪音,只顯示相關的日誌。
# 查看 nginx 服務的所有日誌
sudo journalctl -u nginx.service
# 查看特定時間段內 sshd 的日誌
sudo journalctl -u sshd.service --since "10:00" --until "11:00"
除了 -u,你也可以使用 -t 參數過濾日誌標籤(Tag)。這通常用於應用程式自定義的日誌輸出。
# 查看標籤為 "myapp" 的日誌
sudo journalctl -t myapp
依據嚴重程度過濾
日誌訊息分為多個嚴重程度等級,從 debug 到 emerg。預設情況下,journalctl 會顯示 info 及以上級別的訊息。若你想排查更詳細的除錯資訊,可以調整過濾等級。
# 僅顯示錯誤級別及以上的日誌
sudo journalctl -p err
# 顯示警告及更嚴重的日誌
sudo journalctl -p warning
# 顯示所有級別,包含 debug
sudo journalctl -p debug
常見問題與解決方案
1. 日誌被循環刪除或空間不足
journald 預設會保留日誌直到佔用一定空間或時間。若發現日誌遺失,可以檢查並調整保留策略。
# 查看當前日誌大小
journalctl --disk-usage
# 設定日誌最大保留時間為 7 天
sudo nano /etc/systemd/journald.conf
# 修改或新增以下行:
# SystemMaxUse=1G
# MaxRetentionSec=7day
# 重新啟動 journald 服務以套用設定
sudo systemctl restart systemd-journald
2. 無法查看特定服務的日誌
有時即使服務正在運行,journalctl -u service_name 卻無輸出。這可能是因為服務尚未將日誌寫入 journald,或是權限問題。請確認:
- 服務確實已啟動:
systemctl status service_name - 使用
sudo執行指令,因為部分日誌可能需要 root 權限才能讀取。 - 檢查該服務是否配置為將日誌發送到其他位置(如
/var/log/下的獨立檔案)。
小結
journalctl 是 Linux 系統診斷的瑞士刀。透過組合時間過濾、服務指定與嚴重程度篩選,你能快速縮小問題範圍。建議在日常維護中養成使用 --since 和 -u 的習慣,這將大幅提升你的排錯效率。掌握這些技巧後,面對系統異常時,你將不再感到無從下手。