2009-02-08 68 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的等价物,并提供了类似的功能。