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

时间:2016-05-12 14:42:27

标签: perl hook log4perl

我想在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,因为返回值非常简单。

documentation说:

  

以字符串sub {...开头的每个值都被解释为在应用程序解析配置时要执行的Perl代码...

所以我尝试了类似的东西,但它不起作用:

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

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

1 个答案:

答案 0 :(得分:4)

print成功返回1,所以

sub { print "$av_std_LOGFILE"; }

返回1,而不是$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';

通常,你应该避免全局变量,所以我更喜欢使用子程序。