更改 LogRotate 輪換日誌檔案的預設方式

更改 LogRotate 輪換日誌檔案的預設方式

我對 logrotation 的觀察是,要輪換任何日誌文件,即 logrotate 過程,請按以下順序

  1. 使用新名稱複製有問題的日誌檔案(我們稱之為 file1.log)(在現有名稱中新增時間戳記或數字,使其成為 file1.log-20140513),
  2. 刪除現有文件 (file1.log) 並使用原始名稱 (file1.log) 建立新的空白日誌文件,
  3. 壓縮旋轉檔案 (file1.log-20140513),這將建立一個新的壓縮檔案 (file1.log-20140513.gz),如果設定了壓縮選項,
  4. 刪除旋轉的檔案 (file1.log-20140513),最後,
  5. 移至下一個文件,執行與上述 4 個步驟相同的操作。

我在過程中遇到以下問題:

  1. 我的日誌檔案非常大(每個都超過 10 GB),大約有 42 個這樣的日誌檔案。
  2. 寫入這些檔案的進程同步工作,
  3. 伺服器上的DiskIO很好,但是複製需要時間,壓縮也需要時間,壓縮也消耗CPU。
  4. 我希望所有新建立的日誌檔案都具有從同一時間開始的日誌。

為此,我希望 logrotate 移動,這是 mv 命令所做的事情,它重命名檔案而不是複製它們。至於壓縮,我可以停用它並透過 cron 安排的不同腳本觸發它。但我希望 logrotate 移動文件而不是複製它們。

現在,我確信 logrotate 的作者也會想到這一點,因為它顯然節省了磁碟 IO 和完成整個 logrotate 操作所需的時間,所以我想知道為什麼要複製文件而不是移動或重命名文件,以及如何我可以透過logrotate 實現這一點嗎?

注意:我嘗試手動執行此操作,即移動正在運行的進程正在寫入的文件,並創建一個具有相同名稱和相同權限的新空白文件(即 root,這也是該進程的權限)運行),但在移動並建立新檔案後,我發現該進程沒有向其中寫入任何內容,因此必須重新啟動該進程以使其寫入該檔案。任何人都可以解釋這種行為,為什麼​​ logrotate 設法讓進程寫入同一個文件,但我無法使用簡單的步驟。

答案1

只有當透過指令明確告知 logrotate 這樣做時,您所描述的行為才會發生copytruncate。該文件警告稱,由於此行為可能會丟失一些日誌資料。該指令只能作為最後的手段。

輪換日誌檔案的標準方法是重新命名,然後向進程發送訊號以使其開啟新的日誌檔案。這樣速度更快,不會有遺失部分日誌的風險。但它要求寫入過程能夠切換到新的日誌檔案。

壓縮可以關閉或推遲到下一次旋轉。如果compress使用該指令,舊的日誌檔案將被壓縮。如果未使用該指令,則不會壓縮它們。

如果同時使用compress和,則壓縮會延遲到下一次旋轉。delaycompress這樣,每次輪換後,兩個最新的日誌檔案還不會被壓縮。

答案2

移動並建立新文件後,我發現該進程沒有向其中寫入任何內容,因此必須重新啟動該進程以使其寫入該文件

進程正在寫入同一個文件,這就是為什麼日誌速率複製而不是移動的原因。當您刪除日誌時,進程仍然寫入日誌,您可以看到檔案系統使用量不斷增長,但沒有檔案。進程重新啟動將釋放磁碟空間。

考慮

相關內容