在 ubuntu server 避免 /var/log/syslog 無限制增長

在 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 範例?

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *