【问题标题】:How to get Log4perl rotating my logs daily?如何让 Log4perl 每天轮换我的日志?
【发布时间】:2012-12-05 22:59:16
【问题描述】:

我正在阅读Log4perl 并想尝试使用它来对我在 Linux 机器上运行的 Perl 脚本进行简单的日志管理。我还阅读了newsysloglogrotate,但如果可能的话,我想使用 Log4perl。

我正在尝试配置 /etc/log4perl.conf 文件,以便它:

  • 定义一个widget 记录器(INFO 级别),它将所有输出写入/opt/myapp/logs/myapp-<datetime>.log,其中<datetime> 是日期/时间格式的字符串,如2012-12-20
  • 这个myapp-<datetime>.log 文件需要每天轮换(最好在午夜),删除旧文件,并使用<datetime> + 1 创建一个新文件。例如,myapp-2012-12-20.log 将替换为 myapp-2012-12-21.log 等。

这是我最好的尝试,我相信它已经接近了,但仍然缺少一些配置:

#####/etc/log4perl.conf############################################################
log4perl.logger.widget                      = INFO, MyAppLogAppender

log4perl.appender.MyAppLogAppender          = Log::Log4perl::Appender::File
log4perl.appender.MyAppLogAppender.filename = /opt/myapp/logs/myapp-???.log
log4perl.appender.MyAppLogAppender.layout   = Log::Log4perl::Layout::SimpleLayout
###################################################################################

如何将log4perl.appender.MyAppLogAppender 配置为每天轮换一次、删除旧文件并创建一个具有正确时间戳的新文件?提前致谢。

【问题讨论】:

    标签: linux perl logging log4perl


    【解决方案1】:

    这是一个 Log::Log4perl 配置文件的示例,它定义了在午夜的每日翻转(日期模式 yyyy-MM-dd),在 WARN 级别保留最多 5 个已保存的日志文件,并将所有内容转储到屏幕上:

    log4perl.logger                         = TRACE, Screen, Logfile
    
    log4perl.appender.Logfile               = Log::Dispatch::FileRotate
    log4perl.appender.Logfile.Threshold     = WARN
    log4perl.appender.Logfile.filename      = test.log
    log4perl.appender.Logfile.max           = 5
    log4perl.appender.Logfile.DatePattern   = yyyy-MM-dd
    log4perl.appender.Logfile.TZ            = PST
    log4perl.appender.Logfile.layout        = Log::Log4perl::Layout::PatternLayout 
    log4perl.appender.Logfile.layout.ConversionPattern = %d %m %n
    
    log4perl.appender.Screen                = Log::Log4perl::Appender::Screen
    log4perl.appender.Screen.stderr         = 0
    log4perl.appender.Screen.utf8           = 1
    log4perl.appender.Screen.layout         = Log::Log4perl::Layout::PatternLayout::Multiline
    log4perl.appender.Screen.layout.ConversionPattern = [%p] %m %n
    

    (参考:https://metacpan.org/module/Log::Log4perl::FAQ#How-can-I-roll-over-my-logfiles-automatically-at-midnight-

    【讨论】:

    • Awesome @creaktive (+1) - 还有一件事:log4perl.appender.Logfile.layout 之后的“\”有什么意义?我可以删除它并将值放在 (Log::Log4perl::Layout::PatternLayout) 下方的同一行吗?再次感谢!
    • 另外,我假设 any Perl 脚本使用Log4perl 然后可以使用这个widget 记录器?
    • 抱歉,我保证这是最后一次跟进:看起来您正在配置 WARN 级别以使用 LogFile 附加程序。有没有办法将记录器附加到所有日志级别(警告或其他)的附加程序?再次感谢!!
    • @HeineyBehinds:更新了示例,以便将 WARN 消息记录到旋转日志文件并在屏幕上打印所有内容(TRACE 是最详细的级别)。 `` 字符是换行符,就像在 shell 中一样。完全没有必要:)
    • 嗯...我真的讨厌问这个问题,因为到目前为止你一直很有帮助(我希望我能给你更多的支持!)但是如果我有会发生什么除了test.log 之外,其他想要记录到其他文件的 Perl 脚本?一旦我能看到记录器、附加程序和日志文件的关系,我想所有的灯泡都会亮起来!再次感谢所有的帮助!
    【解决方案2】:

    Log::Dispatch::FileRotate 中有一个问题,如果您的日常工作在当天晚些时候(比如 23:00)运行并且需要 2 小时(因此在大约 01:00 结束),则日志轮换永远不会发生“日”模式,如:

    log4perl.appender.Logfile.DatePattern   = yyyy-MM-dd
    

    一个简单的解决方法是使用这样的“每小时”模式:

    log4perl.appender.Logfile.DatePattern   = yyyy-MM-dd-HH
    

    因此,当下一次运行在 23:00 开始时,日志文件会在一个多小时后轮换。

    【讨论】:

      猜你喜欢
      • 2018-08-23
      • 2016-01-27
      • 2016-12-15
      • 2018-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多