我正在嘗試監視透過 logrotate 頻繁輪換的日誌檔案。但我無法正確理解這一點。誰能解釋一下 logrotate 實際上是如何運作的?
是否重命名文件並建立新文件?
或者是使用新名稱複製文件並且當前文件被清空?
旋轉前:
131887 -rw-r--r-- 1 root root 11385 Sep 25 03:40 /var/log/sas.log
旋轉後:
131887 -rw-r--r-- 1 root root 0 Sep 25 04:40 /var/log/sas.log
131911 -rw-r--r-- 1 root root 11385 Sep 25 04:40 /var/log/sas.log.1
答案1
如果在設定檔中啟用了選項 truncate,則該檔案將不會被移動 - 它的內容只會複製到另一個新建立的檔案中,並且目前檔案將被清除,因此 inode id 不會改變。實際上該文件從未改變。
答案2
輪換時,當前日誌檔案將被移動,並且可能會被壓縮(如果指定)。然後它被重新創建。 [尋找我的經驗以外的來源]
如果正在運行的服務在輪換時打開了日誌文件,則會出現問題。該文件將被取消鏈接,但磁碟空間並未真正釋放,因為該文件仍處於開啟狀態。
這就是為什麼服務經常安裝更複雜的 logrotate 腳本來處理輪調。作為一個例子,看看/etc/logrotate.d/nginx
定義網路伺服器的輪換行為nginx
:
[....]
postrotate
invoke-rc.d nginx rotate >/dev/null 2>&1
endscript
該postrotate
區塊在新日誌檔案建立後執行。它呼叫 nginx 的服務腳本並rotate
告訴服務重新開啟其日誌文件。