You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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
);

原正常场景的原因说明

  1. 将代码放入test.pl时,getLogFileName定义在main包中,匿名子例程能直接找到该函数;
  2. 硬编码文件名时无需调用子例程,不存在命名空间匹配问题。

内容的提问来源于stack exchange,提问作者h q

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 11:30:52