我有一个已添加日志记录的 Perl 脚本,由Log4perl提供。
脚本本身运行时间很长,我们还需要每天进行日志轮换/归档。
我选择使用内置的 Solaris logadm
,而不是使用Log::Dispatch::FileRotate,因为
- 我们正在尝试减少我们需要的 Perl 依赖项的数量,并且
- 我的印象是,在您的应用程序之外的操作系统级别执行此操作是首选/最强大的方法。
作为轮换的一部分,我还需要获取 Perl 脚本来刷新其文件句柄。根据Log4perl FAQ,您可以将其配置为侦听 USR1 信号,并在其上重新创建文件句柄:
log4perl.rootLogger = DEBUG, INFOLOG, DEBUGLOG
log4perl.appender.INFOLOG = Log::Log4perl::Appender::File
log4perl.appender.INFOLOG.filename = myprogram.info.log
log4perl.appender.INFOLOG.mode = append
log4perl.appender.INFOLOG.recreate = 1
log4perl.appender.INFOLOG.recreate_check_signal = USR1
log4perl.appender.INFOLOG.layout = Log::Log4perl::Layout::PatternLayout
log4perl.appender.INFOLOG.layout.ConversionPattern = %d [%p] (%F line %L) %m%n
log4perl.appender.INFOLOG.Threshold = INFO
log4perl.appender.DEBUGLOG = Log::Log4perl::Appender::File
log4perl.appender.DEBUGLOG.filename = myprogram.debug.log
log4perl.appender.DEBUGLOG.mode = append
log4perl.appender.INFOLOG.recreate = 1
log4perl.appender.INFOLOG.recreate_check_signal = USR1
log4perl.appender.DEBUGLOG.layout = Log::Log4perl::Layout::PatternLayout
log4perl.appender.DEBUGLOG.layout.ConversionPattern = %d [%p] (%F line %L) %m%n
但是,由于某种原因,每当我向 Perl 进程发送 USR1 信号时,我的 Perl 脚本就会退出。
我发送它:
kill -s USR1 <pid>
一旦我这样做,Perl 进程似乎就死了。无论我是否将 Log4perl 配置为捕获 USR1,都会发生这种情况。
我也试过用USR2,效果一样。
在 Log4perl、Perl 或 Solaris 中,我在这里有什么明显的遗漏吗?