Log-Files

unix logrotate 指定塊大小

  • January 25, 2015

如何指定旋轉後我想要的輸出文件大小?例如,假設我想在日誌文件達到 10MB 時執行 logrotate,並且我想將此日誌拆分為最大 1MB 的塊。我找到了“大小”選項,但這設置了執行 logrotate 的限制,而不是所需塊的大小。謝謝

logrotate 本身不支持旋轉日誌的拆分,僅支持壓縮。

您可以通過編寫自己的處理拆分的腳本來獲得所需的行為,並將其作為該特定文件的 logrotate 配置中的 postrotate 腳本呼叫。

更新:根據您的評論(“拆分文件為時已晚,因為它們將被 logrotate 拆分”),您似乎仍然認為 logrotate 正在拆分文件。這是不正確的,實際發生的是 logrotate 重命名現有文件並使用原始名稱創建一個新的空文件。

一個例子:

/var/log/syslog
{
       rotate 7
       daily
       missingok
       notifempty
       delaycompress
       compress
       postrotate
               reload rsyslog >/dev/null 2>&1 || true
       endscript
}

當 logrotate 執行時:

  • 它將 /var/log/syslog 重命名為 /var/log/syslog.1
  • 然後它會創建一個新的空文件 /var/log/syslog。
  • 重命名文件對任何具有打開文件句柄的程序都沒有影響,因此在這樣做之後,rsyslog 程序仍在寫入舊文件 syslog.0。通常,解決這個問題的方法是重新載入寫入文件的程序/es,這就是 postrotate 腳本中發生的事情。rsyslog 被告知重新載入,它關閉其現有文件句柄到 /var/log/syslog.0,並使用文件名 /var/log/syslog 打開一個新的文件句柄,這是由 logrotate 創建的新空文件。

希望您對 logrotate 現在正在做什麼有更好的理解。

更新 2:我將在這裡解決您的評論,因為評論部分中的格式選項是有限的。

因此,當我在後處理部分正確理解時,有必要重新載入 rsyslog 以確保關閉舊文件描述符(旋轉前)並打開新文件描述符(旋轉後)(因為:mv syslog syslog.1) ?

100% 正確。logrotate 移動文件後,rsyslog 仍在寫入舊文件描述符。程序對文件描述符執行 I/O,名稱僅在對文件執行初始打開時才有意義。

我認為 logrotate 有一些機制可以自動實現這一點。

不,因此需要在 postrotate 腳本中執行此操作。請記住,並非所有日誌記錄都必須由保留打開文件描述符的程序完成。如果您有一個打開文件、寫入文件然後反復關閉(文件描述符)的程序,那麼您無需對 postrotate 中的任何內容大驚小怪。

PS:您在以下句子中是指“syslog.0”而不是“syslog”:“rsyslog 程序仍在寫入舊文件 syslog.0。”?因為“舊”日誌是 /var/log/syslog 而不是 /var/log/syslog.0。謝謝

不,我的意思是它仍在寫入現有的文件描述符,logrotate 已將其重命名為 syslog.0。在處理 rsyslog 之類的程序時,請始終記住文件名僅在 rsyslog 打開它時才相關,即在它創建文件描述符時。之後,您可以重命名、移動甚至刪除文件,並且該程序繼續不受阻礙地對文件描述符執行 I/O。

引用自:https://serverfault.com/questions/513795