3

我正在阅读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为每天轮换一次、删除旧文件并创建一个具有正确时间戳的新文件?提前致谢。

4

2 回答 2

13

下面是一个 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- )

于 2012-12-18T17:28:06.643 回答
0

有一个陷阱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 开始时,日志文件会在一个多小时过去后轮换。

于 2020-04-27T08:05:27.020 回答