logrotate 可以對日誌文件進行輪換、壓縮並刪除舊日誌文件,在大多數的 Linux 發行版中都默認安裝了 logrotate,而且自動每天執行。
logrotate 的配置文件#
創建並編輯文件 /etc/logrotate.d/app
,一般來說,/etc/logrotate.conf
中會有 include /etc/logrotate.d
這樣的配置,這樣就會自動加載 /etc/logrotate.d
目錄下的配置文件。
/root/app/log/app.log {
daily # 每天輪換
missingok # 如果日誌文件不在也不報錯
rotate 100 # 保留 100 個日誌文件
compress # 對舊的日誌文件進行壓縮
delaycompress # 延遲壓縮直到下一次輪換
notifempty # 只有在日誌文件不為空的時候才輪換
dateext # 使用當前日期作為日誌文件的後綴
dateformat -%Y%m%d # 設置日期格式
olddir /root/app/log/old # 設置舊日誌文件的存放目錄,這個目錄必須事先創建好
sharedscripts # 腳本將在所有日誌輪換後一次運行,而不是對每個文件都運行一次
postrotate # 日誌輪換後執行的腳本
/usr/bin/docker restart app
endscript # 腳本結束
}
注意:重啟服務的時候,可能會導致網絡斷開,這個需要注意一下。可以使用這種方式來進行測試,測試 restart 過程中的網絡是否會斷開
for i in {1..1000}; do { curl -I https://example.com/; sleep 0.3; } ; done
測試#
此處直接使用 logrotate 命令來測試,-d 表示 debug 模式,-f 表示強制執行,-v 表示 verbose 模式,可以看到執行的過程。debug 模式下不會真正執行,只是打印出執行的過程,可以用來測試。
logrotate -dfv /etc/logrotate.d/app
取消 debug 模式後,結果如下
$ tree
.
├── app.log
└── old
├── app.log-20231116.gz
└── app.log-old
1 directory, 3 files
可能還存在的問題#
- 權限: 我當前這邊直接用的是 root 用戶,所以沒有遇到權限問題,如果是其他用戶,可能會遇到權限問題,需要注意一下。
- 重啟: postrotate 中的腳本是在日誌輪換後執行的,所以如果是重啟服務,可能會導致網絡斷開,這個需要注意一下。
- 根據文件大小輪換: 如果是根據文件大小輪換,那麼可能會出現日誌文件被截斷的情況,這個需要注意一下。我此處沒用根據文件大小輪換,所以沒遇到這個問題。
參考資料#
- Linux 日誌切割神器 logrotate 原理介紹和配置詳解 - 寫的很好的一篇文章,裡面有講到 logrotate 的原理。
- logrotate(8) - Linux man page - logrotate 的官方文檔,用於查看 logrotate 的詳細配置。