我對 logrotation 的觀察是,要輪換任何日誌文件,即 logrotate 過程,請按以下順序
- 使用新名稱複製有問題的日誌檔案(我們稱之為 file1.log)(在現有名稱中新增時間戳記或數字,使其成為 file1.log-20140513),
- 刪除現有文件 (file1.log) 並使用原始名稱 (file1.log) 建立新的空白日誌文件,
- 壓縮旋轉檔案 (file1.log-20140513),這將建立一個新的壓縮檔案 (file1.log-20140513.gz),如果設定了壓縮選項,
- 刪除旋轉的檔案 (file1.log-20140513),最後,
- 移至下一個文件,執行與上述 4 個步驟相同的操作。
我在過程中遇到以下問題:
- 我的日誌檔案非常大(每個都超過 10 GB),大約有 42 個這樣的日誌檔案。
- 寫入這些檔案的進程同步工作,
- 伺服器上的DiskIO很好,但是複製需要時間,壓縮也需要時間,壓縮也消耗CPU。
- 我希望所有新建立的日誌檔案都具有從同一時間開始的日誌。
為此,我希望 logrotate 移動,這是 mv 命令所做的事情,它重命名檔案而不是複製它們。至於壓縮,我可以停用它並透過 cron 安排的不同腳本觸發它。但我希望 logrotate 移動文件而不是複製它們。
現在,我確信 logrotate 的作者也會想到這一點,因為它顯然節省了磁碟 IO 和完成整個 logrotate 操作所需的時間,所以我想知道為什麼要複製文件而不是移動或重命名文件,以及如何我可以透過logrotate 實現這一點嗎?
注意:我嘗試手動執行此操作,即移動正在運行的進程正在寫入的文件,並創建一個具有相同名稱和相同權限的新空白文件(即 root,這也是該進程的權限)運行),但在移動並建立新檔案後,我發現該進程沒有向其中寫入任何內容,因此必須重新啟動該進程以使其寫入該檔案。任何人都可以解釋這種行為,為什麼 logrotate 設法讓進程寫入同一個文件,但我無法使用簡單的步驟。
答案1
只有當透過指令明確告知 logrotate 這樣做時,您所描述的行為才會發生copytruncate
。該文件警告稱,由於此行為可能會丟失一些日誌資料。該指令只能作為最後的手段。
輪換日誌檔案的標準方法是重新命名,然後向進程發送訊號以使其開啟新的日誌檔案。這樣速度更快,不會有遺失部分日誌的風險。但它要求寫入過程能夠切換到新的日誌檔案。
壓縮可以關閉或推遲到下一次旋轉。如果compress
使用該指令,舊的日誌檔案將被壓縮。如果未使用該指令,則不會壓縮它們。
如果同時使用compress
和,則壓縮會延遲到下一次旋轉。delaycompress
這樣,每次輪換後,兩個最新的日誌檔案還不會被壓縮。
答案2
移動並建立新文件後,我發現該進程沒有向其中寫入任何內容,因此必須重新啟動該進程以使其寫入該文件
進程正在寫入同一個文件,這就是為什麼日誌速率複製而不是移動的原因。當您刪除日誌時,進程仍然寫入日誌,您可以看到檔案系統使用量不斷增長,但沒有檔案。進程重新啟動將釋放磁碟空間。
考慮
- 減少寫入日誌,所有記錄的資訊都是必要的嗎?
- 閱讀文檔,例如:http://www.thegeekstuff.com/2010/07/logrotate-examples/