如何修復完整的 systemd 日誌
11 分鐘閱讀 - 2026年5月20日

使用 vacuum 指令、journald.conf 大小限制、自動清潔計時器和日誌轉寄,診斷並修復完整的 systemd 日誌。
如何解決 systemd 日誌滿載的問題
systemd 日誌會儲存伺服器產生的每則記錄訊息,若在根分割區較小的 VPS 上,它可能會悄無聲息地耗盡您的可用磁碟空間。一旦發生這種情況,服務將無法啟動、寫入作業會停滯,而您也將失去用來釐清問題根源的關鍵診斷資料。本指南將說明如何診斷問題、立即釋放空間,並設定 journald 以防止此情況再次發生。
問題診斷
首先檢查日誌檔案佔用了多少空間:
journalctl --disk-usage此處顯示所有活躍與歸檔日誌檔案的總大小。請將其與您的可用磁碟空間進行比較,使用 df -h。在 20 GB 的根分區中,即使 2 GB 的日誌也佔總磁碟空間的 10% 以上,這足以引發問題。
接著,找出哪些服務產生了最多的日誌。這行指令會列出過去 24 小時內前 10 大日誌來源:
journalctl --since "24 hours ago" | awk '{print $5}' | cut -d'[' -f1 | sort | uniq -c | sort -rn | head -10使用 journalctl -p err -b 來篩選錯誤訊息,以確認是否有單一服務陷入崩潰循環並淹沒日誌。您也可以檢查 journald 是否對任何服務進行了速率限制:
journalctl -u systemd-journald | grep -i "suppressed"被壓制的訊息表示某項服務在 30 秒內超過了 10,000 筆條目的預設閾值。那就是肇事者。
在 VPS 實例上,有幾種情況特別常見。如果 Storage=auto 已設定且 /var/log/journal/ 且該檔案存在,journald 會使用持久儲存空間,其預設上限約為 4 GB。在較小的根分區上,此空間會迅速耗盡。非正常關機也可能留下帶有 .journal~ 後綴。這些檔案無法正常輪替,會持續佔用空間。
安全清除日誌
在刪除任何內容之前,請先輪替活躍的日誌檔案,以保留當前日誌:
journalctl --rotate接著清理歸檔的日誌。您可以根據時間、大小或檔案數量進行篩選:
sudo journalctl --vacuum-time=1d
sudo journalctl --vacuum-size=100M
sudo journalctl --vacuum-files=5第一個指令會刪除超過 24 小時的日誌。第二個指令會將日誌總大小縮減至 100 MB。第三個指令則僅保留最近的五個歸檔檔案。請選擇最符合您現況的選項。
若磁碟空間已完全滿載且 journalctl 指令無回應,您可能需要手動刪除日誌檔案:
sudo rm -rf /var/log/journal/*
sudo systemd-tmpfiles --create --prefix /var/log/journal此為最後手段。此操作將清除所有儲存的日誌,並以正確權限重新建立目錄。完成任何清理後,請重新啟動守護程序並進行驗證:
sudo systemctl restart systemd-journald
journalctl --disk-usage設定 Journald 大小限制
預設的 journald 設定相當寬鬆。在 VPS 上,這些設定甚至過於寬鬆。請編輯設定檔以對日誌儲存空間設定硬性上限。建議建立覆寫檔案而非直接編輯主設定檔,如此一來您的變更才能在套件更新後保留:
sudo mkdir -p /etc/systemd/journald.conf.d/
sudo nano /etc/systemd/journald.conf.d/size-limits.conf關鍵指令:
| 參數 | VPS(20-40 GB 磁碟空間) | 專用伺服器 | 功能說明 |
|---|---|---|---|
| SystemMaxUse | 500M 至 1G | 2G 至 5G | 日誌總大小的硬性上限 |
| SystemKeepFree | 1G | 磁碟空間的 10% | 為作業系統預留的可用空間 |
| 最大保留秒數 | 7 天至 14 天 | 30 天至 90 天 | 自動刪除超過此時間的日誌 |
| SystemMaxFileSize | 20M 至 50M | 100M | 每個日誌檔案的最大大小 |
同時設定兩者 SystemMaxUse 和 SystemKeepFree 可提供雙重保障:日誌會限制在固定大小,且無論磁碟上還有什麼內容,系統總是有餘裕。
持久性儲存與暫存性儲存
`logs` Storage= 指令控制日誌的儲存位置。設定 Storage=persistent 將日誌寫入 /var/log/journal/ 。這正是生產伺服器所需的設定,因為日誌在重新開機後仍會保留,您可事後調查系統當機原因。若目錄不存在,則會自動建立:
sudo mkdir -p /var/log/journal另一種選擇, Storage=volatile則將日誌保留在 RAM 中的 /run/log/journal/。重啟後日誌將消失。此模式適用於短暫存在的容器,或會將所有日誌轉發至外部系統的伺服器。
在高流量伺服器上停用壓縮
Journald 預設會壓縮大於 512 位元的資料物件。在處理大量日誌吞吐量的伺服器上,這會增加 CPU 負載。若您將日誌轉發至外部且無需最小化本地儲存空間,請設定 Compress=no 若您將日誌轉發至外部且無需最小化本地儲存空間。同時請在生產環境中設定 ForwardToConsole=no 。主控台轉發是同步的,若虛擬序列主控台陷入停滯,可能會完全阻塞 journald 守護程序。
進行任何設定變更後,請重新啟動服務:
sudo systemctl restart systemd-journald自動化日誌維護
手動清理無法擴展。請建立一個 systemd 定時器,以排程方式清理日誌。在 /etc/systemd/system/journal-vacuum.service:
[Unit]
Description=Vacuum old journal logs
[Service]
Type=oneshot
ExecStart=/usr/bin/journalctl --vacuum-time=7d --vacuum-size=500M接著在 /etc/systemd/system/journal-vacuum.timer:
[Unit]
Description=Weekly journal vacuum
[Timer]
OnCalendar=Sun 02:00
Persistent=true
[Install]
WantedBy=timers.target透過 sudo systemctl enable --now journal-vacuum.timer。此定時器每週日凌晨 2 點執行,並在單次處理中同時套用基於時間與基於大小的保留規則。
有一點是定時器無法處理的:損壞的日誌檔案。在發生非正常關機後,journald 會透過在檔案名稱後附加 ~ 。這些 .journal~ 檔案仍會佔用磁碟空間,但不會被自動清理。請定期檢查並移除舊檔案:
find /var/log/journal/ -name "*.journal~" -mtime +30 -delete將日誌轉發至外部
對於需要長期保留日誌但又不希望增加本地儲存空間的伺服器,請將日誌轉發至集中式系統。最簡單的方法是在 journald.conf:
ForwardToSyslog=yes對於包含完整元資料(PID、UID、單元名稱)的結構化日誌,請使用 systemd-journal-remote 將 JSON 格式的記錄條目傳送至日誌管理平台。若本地磁碟發生故障或伺服器遭入侵,外部日誌儲存亦能保護您的稽核追蹤紀錄。

Linux 伺服器加固清單
15 分鐘閱讀 - 2026年5月8日