如何旋转和压缩Log4perl日志文件?

时间:2009-02-08 21:29:10

标签: perl rotation log4perl

据我所知,Log4Perl或CPAN中的任何相关模块都不支持旋转和放大。压缩日志文件。

可以使用以下方法完成轮换:

  1. Log::Log4perl::Appender::File
  2. Log::Dispatch::FileRotate
  3. 但两个模块都不支持旋转压缩。 (Log :: Dispatch :: FileRotate在它的待办事项列表中有它,但它目前没有实现)。

    可以使用Linux中的标准Logrotate工具,使用Log :: Log4perl :: Appender :: File的recreate_check_interval或recreate_check_signal。

    从初始测试开始,看起来使用带有delaycompress选项的Logrotate即可在高负载的机器上运行,因为一旦移动文件,log4perl将继续记录到相同的文件句柄,直到信号很好。

    但是,如果不使用delaycompress,并且压缩日志文件和通过Perl程序捕获信号之间存在(甚至稍有延迟),则某些日志记录数据可能会丢失。

    你怎么看?还有其他我们没有想到的选择吗?

3 个答案:

答案 0 :(得分:5)

多年来,我发现您几乎总是希望使用外部方法来使用Log4perl进行日志文件轮换。您只需避免内部日志旋转不可避免地遇到的许多细微问题(日志延迟,权限问题)。

你提到过两种在Linux上使用logrotate的方法,为什么不坚持使用它们呢? Log4perl FAQ describes using newsyslog是FreeBSD等效的logrotate并提供类似的功能。

答案 1 :(得分:3)

您是否考虑过使用Log :: Dispatch :: FileRotate的维护人员添加缺少的功能并且需要?毕竟它是开源的。 :)

如果您不想自己处理,可以使用各种CPAN支持咨询服务。

答案 2 :(得分:3)

我按照此处的建议联系了Log :: Dispatch :: FileRotate的作者,他解释了为什么还没有在Log :: Dispatch :: FileRotate中实现压缩的原因。

基本上,旋转后立即压缩可能会阻止运行过程,压缩过程非常昂贵。

建议的选项是允许Log :: Dispatch :: FileRotate的用户在旋转之后在文件上执行任意应用程序,从而在另一个非阻塞过程中执行。

另一个建议是让文件系统触发器(如inotify)在主进程关闭文件时触发压缩。

另一个建议是编写通过gzip管道或其中一个perl gzip模块压缩的日志文件。这有效,但会导致一些问题(grep / less)不起作用。 zgrep和zless会起作用,但是当grefip文件仍然可以写入时,zgrep会发出一个丑陋的警告。在文件上使用“tail”也行不通 - 所以这个选项不实用。