2009-02-08 67 views
10

從我能告訴的既不Log4Perl或其任何相關模塊在CPAN支持旋轉&壓縮日誌文件。如何旋轉和壓縮Log4perl日誌文件?

旋轉可以通過使用來完成:

  1. Log::Log4perl::Appender::File
  2. Log::Dispatch::FileRotate

但是這兩個模塊都不支持輪轉壓縮。 (Log :: Dispatch :: FileRotate在它的todo列表中有它,但它目前沒有實現)。

通過使用Log :: Log4perl :: Appender :: File的recreate_check_interval或recreate_check_signal,可以在Linux中使用標準Logrotate工具來執行此操作。

從最初的測試看來,使用Logrotate看起來像使用delaycompress選項可以做到這一點 - 即使在高負載的機器上也是如此,因爲一旦文件被移動,log4perl將繼續記錄到相同的文件句柄,直到信號被毫無遺漏。

但是,如果沒有使用delaycompress,並且在壓縮日誌文件和捕獲Perl程序捕獲信號之間(即使稍稍延遲),某些日誌記錄數據可能會丟失。

您認爲如何?還有其他的選擇我們沒有想到?

+0

不直接回答問題,但有很多log4perl配置的很好的例子,這裏的地址輪轉日誌文件等http://www.netlinxinc.com/netlinx-blog/52-perl/126-eight-loglog4perl-recipes。 html – 2012-05-15 01:06:16

+0

...和一些偉大的食譜在這裏http://log4perl.sourceforge.net/releases/Log-Log4perl/docs/html/Log/Log4perl/FAQ.html – 2012-05-15 01:23:13

回答

3

您是否想過使用Log :: Dispatch :: FileRotate的維護人員來添加缺少的功能以及您需要的功能?畢竟它是開源的。 :)

如果你不想自己處理,有各種CPAN支持顧問爲你做。

3

我聯繫了Log :: Dispatch :: FileRotate的作者,正如這裏所建議的,他解釋了爲什麼壓縮還沒有在Log :: Dispatch :: FileRotate中實現的原因。

基本上,旋轉後立即壓縮可能會阻止運行過程,在壓縮過程中非常昂貴。

建議的選項是允許Log :: Dispatch :: FileRotate的用戶在文件上執行一個任意的應用程序,在旋轉後執行,從而在另一個非阻塞進程中執行。

另一個建議是在文件關閉時由主進程寫入文件系統觸發器(如inotify)來觸發壓縮。

還有一個建議是編寫通過gzip管道或perl gzip模塊之一壓縮的日誌文件。這有效,但會導致一些問題(grep/less)不起作用。 zgrep和zless都可以工作,但是在grep仍然可以寫入的gzip文件上時,zgrep會給出一個難看的警告。在文件上使用「tail」也不起作用 - 所以這個選項不實用。

5

多年來,我發現你幾乎總是想用Log4perl的外部日誌文件輪換方法。您只需避免內部日誌旋轉不可避免地遇到的很多細微問題(日誌延遲,權限問題)。

你已經提到了兩種在Linux上使用logrotate的方法,爲什麼不堅持使用它們? Log4perl FAQ describes using newsyslog這是FreeBSD的等價物,並提供了類似的功能。