日誌輪轉如何運作?

日誌輪轉如何運作?

我正在嘗試監視透過 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告訴服務重新開啟其日誌文件

相關內容