如何在 Log::Log4perl 配置文件中使用 Perl 变量?

How can I use a Perl variable in my Log::Log4perl config file?

我想在 Log::Log4perl 配置文件中使用脚本中的 Perl 变量。我阅读了文档,发现我可以使用子例程,但如果可能的话,我想做的更简单一些。

我想为我的 appender 设置文件名:

log4perl.appender.av_std_LOGFILE.filename="whateverfilename.log"

但是这样一来,就是固定值了。

我的脚本中有一个变量的文件名,我想在运行时使用它:

log4perl.appender.av_std_LOGFILE.filename=\
 sub { return &av_getLogfileName(); }

这是子程序所在的位置:

sub av_getLogfileName
{
    return $av_std_LOGFILE;
}

这可行,但我想避免在我的脚本中使用 sub,因为 return 值非常简单。

documentation 说:

Each value starting with the string sub {... is interpreted as Perl code to be executed at the time the application parses the configuration...

所以我尝试了类似的方法,但没有成功:

log4perl.appender.av_std_LOGFILE.filename=\
    sub { print "$av_std_LOGFILE"; }

有没有办法在我的脚本中没有 sub 的情况下获取变量的结果?

print returns 1 成功,所以

sub { print "$av_std_LOGFILE"; }

returns1,不是$av_std_LOGFILE的值。您还必须 fully qualify variable names in hooks,这意味着您必须 $av_std_LOGFILE 全局包。

将您的挂钩更改为:

sub { return $main::av_std_LOGFILE; } # double quotes are unnecessary

并像这样在脚本中设置 $av_std_LOGFILE(在调用 Log::Log4perl::init 之前):

our $av_std_LOGFILE = '/path/to/logfile';

一般来说,你应该避免全局变量,所以我更喜欢使用子程序。