Rsyslog
帶有 logrotate 的 rsyslog:重新載入 rsyslog 與 copytruncate
我正在使用預設的 rsyslog 和 logrotate 實用程序在 Ubuntu 14 上工作。
在預設的 rsyslog logrotate
/etc/logrotate.d/rsyslog
配置中,我看到以下內容:/var/log/syslog { rotate 7 daily missingok notifempty delaycompress compress postrotate reload rsyslog >/dev/null 2>&1 || true endscript }
據我了解,建議在所有 logrotate 場景中使用 copytruncate,因為它不會移動目前日誌,而是截斷日誌,以便任何具有打開文件處理程序的程序都能夠繼續寫入它。
那麼如何使用 rsyslog 重新載入功能代替預設配置呢?
要回答您的問題,您首先需要了解重新載入和複製截斷的不同權衡:
- reload:舊的日誌文件被重命名,寫入該日誌的程序被通知(通過 Unix 信號)重新創建其日誌文件。這是最快/成本更低的方法:重命名/移動操作非常快並且執行時間恆定。此外,它幾乎是原子操作:這意味著在移動/重新載入期間(幾乎)不會失去任何日誌條目。另一方面,您需要一個能夠重新載入和重新打開其日誌文件的程序。rsyslog就是這樣一個程序,所以預設logrotate config使用reload方式。rsyslog 上游強烈建議將此模式與 rsyslog 一起使用。
- copytruncate:將舊日誌文件複製到存檔文件中,然後將其截斷以“刪除”舊日誌行。雖然截斷操作非常快,但副本可能會很長(取決於您的日誌文件有多大)。此外,在複製操作(記住,它可能很慢)和截斷之間的時間裡,一些日誌條目可能會失去。由於這些原因,對於能夠重新載入和重新創建其日誌文件的服務,預設情況下不使用 copytruncate。另一方面,如果伺服器無法重新載入/重新創建日誌文件,則 copytruncate 是您最安全的選擇。換句話說,它不需要任何服務級別的支持。rsyslog 上游項目強烈建議不要使用這種模式。