在 Ubuntu 中,/var/log/syslog
檔案可能會因為系統訊息、錯誤、服務紀錄不斷寫入而無限制增長,導致磁碟空間耗盡。以下是避免 /var/log/syslog 無限制增長的幾個有效方法:
✅ 1. 設定 logrotate,自動壓縮與清理 syslog
Ubuntu 預設就有安裝 logrotate
,它會自動輪替 log 檔案。你可以調整其設定。
編輯設定:
sudo nano /etc/logrotate.d/rsyslog
常見設定範例:
/var/log/syslog
{
rotate 7 # 保留 7 個歷史檔
daily # 每天輪替一次
missingok
notifempty
delaycompress
compress # 啟用 gzip 壓縮
postrotate
/usr/lib/rsyslog/rsyslog-rotate
endscript
}
這樣會每天產生新的 log 檔,壓縮舊的,最多保留 7 天。
✅ 2. 調整 rsyslog 設定,過濾過多的訊息
如果你的 syslog
滿是重複或無關的 log,可以調整 rsyslog
的紀錄規則:
編輯:
sudo nano /etc/rsyslog.d/50-default.conf
範例:停用一些不必要的 logging
# 將這些註解起來,減少寫入量
#*.*;auth,authpriv.none -/var/log/syslog
或加入條件過濾,只記錄重要等級以上的訊息(如警告以上):
if $syslogseverity <= 4 then -/var/log/syslog
& stop
其中
4
代表 warning,0
為 emergency,數字越小等級越高。
✅ 3. 使用 systemd journal 限制大小
如果你使用的是 journald
而非傳統 syslog,也可能是 journal 填滿空間。
設定檔路徑:
sudo nano /etc/systemd/journald.conf
修改以下參數:
SystemMaxUse=500M # journal logs 最大使用空間
SystemKeepFree=100M # 至少保留多少空間
MaxRetentionSec=3week # 最長保留多久
儲存後重啟:
sudo systemctl restart systemd-journald
✅ 4. 清除現有的過大 log
若你空間已滿,可先手動清除老舊 log:
使用 logrotate 立即執行一次:
sudo logrotate -f /etc/logrotate.d/rsyslog
清除壓縮後的老舊 logs:
sudo rm /var/log/syslog.*.gz
✅ 5. 檢查是否有異常應用程式瘋狂寫 log
用以下指令觀察寫入 syslog 的頻率與來源:
sudo tail -f /var/log/syslog
例如你看到某個服務一直刷錯誤,就要去修該服務(如 cron job 錯誤、docker 無限重啟、某硬體出錯等)。
✅ 總結建議
方法 | 說明 |
---|---|
✅ 設定 logrotate | 控制 log 大小與保留天數 |
✅ 篩選 rsyslog | 避免記錄低重要性訊息 |
✅ 限制 journald 空間 | 避免 journalctl 佔用過多空間 |
✅ 定期清理 | 自動或手動清理壓縮後的歷史 log |
✅ 偵測異常寫入源頭 | 停止或修復異常寫入的應用程式或服務 |
若你提供目前 syslog
寫入速度異常或是無法清理的狀況,我可以進一步協助你偵錯哪個服務造成問題。是否需要我幫你列出一段自動清理 log 的 cron job 範例?