在Perl包中使用Log4perl自定义日志文件名报错的解决咨询
解决Perl包中Log4perl调用自定义子例程的错误
问题原因
错误提示Undefined subroutine &main::getLogFileName,是因为Log4perl解析配置中的匿名子例程时,默认在main包的命名空间执行,而getLogFileName是定义在MyPackage包中的子例程,跨命名空间找不到该函数。
解决方案
方案一:明确指定包名调用子例程
修改MyPackage.pm中配置字符串的filename行,在调用getLogFileName时加上包名前缀:
log4perl.appender.App.filename = sub { return MyPackage::getLogFileName(); }
方案二:提前获取文件名并插值到配置中
先调用getLogFileName拿到文件名,再通过双引号字符串插值将文件名写入配置(替换原来的单引号q()为双引号qq()):
sub getLogFileName { return "log.txt"; } my $log_file = getLogFileName(); my $log_conf = qq( log4perl.logger = ALL, App, Screen log4perl.appender.App = Log::Log4perl::Appender::File log4perl.appender.App.filename = $log_file log4perl.appender.App.layout = Log::Log4perl::Layout::PatternLayout log4perl.appender.App.layout.ConversionPattern=%d{yyyy-MM-dd'T'HH:mm:ss.SSS} %p %l %m%n log4perl.appender.Screen = Log::Log4perl::Appender::Screen log4perl.appender.Screen.stderr = 0 log4perl.appender.Screen.layout = Log::Log4perl::Layout::SimpleLayout );
原正常场景的原因说明
- 将代码放入
test.pl时,getLogFileName定义在main包中,匿名子例程能直接找到该函数; - 硬编码文件名时无需调用子例程,不存在命名空间匹配问题。
内容的提问来源于stack exchange,提问作者h q
相关产品推荐
相关产品推荐

