【问题标题】:How can I use a Perl variable in my Log::Log4perl config file?如何在我的 Log::Log4perl 配置文件中使用 Perl 变量?
【发布时间】:2016-05-12 14:42:26
【问题描述】:

我想在 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 的情况下获取变量的结果?

【问题讨论】:

  • 您说$av_std_LOGFILE 在脚本中设置了几次,在模块中设置了几次。是哪个?
  • 另外,你不应该用& 调用子程序,除非你知道它是做什么的。 return &av_getLogfileName(); 应该是 return av_getLogfileName();(或者更好的是,return av_get_logfile_name();,混合蛇形和骆驼形的大小写真的很难阅读,而蛇形大小写在 Perl 中通常是首选)。

标签: perl hook log4perl


【解决方案1】:

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';

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

【讨论】:

  • 谢谢;我收到错误消息:无法在 /home/fx42252/perl5/lib/perl5/Log/Log4perl/Appender/File.pm 第 124 行打开 (Datei oder Verzeichnis nicht gefunden)。在 /home/fx42252/perl5/lib/ perl5/Log/Log4perl/Appender/File.pm 第 129 行。
  • 要么你没有在包main中设置$av_std_LOGFILE,要么你在调用Log::Log4perl::init之后设置它。如果要在模块内设置变量,则需要使用模块的包名,例如如果你的模块代码是package Foo::Bar; our $av_std_LOGFILE = '/foo';,那么你的钩子就是sub { return $Foo::Bar::av_std_LOGFILE; }
  • 让我们跳过表达式“模块”。到目前为止,我一直在使用 perl 来替换 bash 脚本。所以实际上并没有像包,模块这样的结构......到目前为止我所理解的是,通过这种方式使用perl,它都是“main ::”。没有把握。无论如何:您可以确定在使用 init 时设置了变量。
  • 我们的 $av_std_LOGFILE='test.log'; $av_std_DEBUG && 说“调试 \$av_std_LOGFILE: $av_std_LOGFILE”;日志::Log4perl::Config->utf8(1);日志::Log4perl::init("av_log4perl.conf");我的 $logger = get_logger();$logger->error("Blah");这就是脚本的全部内容——仅用于测试。
  • 查看我对原始问题的编辑,现在显示了整个脚本。
猜你喜欢
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-22
  • 2016-07-31
  • 1970-01-01
相关资源
最近更新 更多