【问题标题】:Can Perl's Log::Log4perl's log levels be changed dynamically without updating config?Perl 的 Log::Log4perl 的日志级别可以在不更新配置的情况下动态更改吗?
【发布时间】:2011-08-22 14:51:22
【问题描述】:

我有一个在 mod_perl 下运行的 Mason 模板,它使用 Log::Log4perl。

我想更改特定附加程序的日志级别,但是更改配置太麻烦了,因为它必须通过我们的部署过程才能上线。

有没有办法在运行时更改附加程序的日志级别,在 Apache 启动之后,而不更改配置文件,然后让该更改影响任何新的 Apache 线程?

【问题讨论】:

    标签: perl apache logging mod-perl log4perl


    【解决方案1】:

    如果您已从 Log::Log4perl::Level 导入日志级别常量,那么您可以执行以下操作:

    $logger->level($ERROR); # one of DEBUG, INFO, WARN, ERROR, FATAL
    
    $logger->more_logging($delta); # Increase log level by $delta levels,
                                   # a positive integer
    
    $logger->less_logging($delta); # Decrease log level by $delta levels.
    

    这是在Log::Log4perl docsChanging the Log Level on a Logger 部分。

    【讨论】:

    • 好的,但是我要如何指定要更改日志级别的包?
    【解决方案2】:

    这对我来说似乎有点 hacky,但它确实有效:

    $Log::Log4perl::Logger::APPENDER_BY_NAME{SCREEN}->threshold($DEBUG);

    为了使其更具动态性,您可以为 Appender 名称和级别传入一个变量。

    %LOG4PERL_LEVELS =
    (
      OFF   =>$OFF,
      FATAL =>$FATAL,
      ERROR =>$ERROR,
      WARN  =>$WARN,
      INFO  =>$INFO,
      DEBUG =>$DEBUG,
      TRACE =>$TRACE,
      ALL   =>$ALL
    );
    
    $Log::Log4perl::Logger::APPENDER_BY_NAME{$appender_name}->threshold($LOG4PERL_LEVELS{$new_level});
    

    【讨论】:

      猜你喜欢
      • 2019-05-18
      • 1970-01-01
      • 2018-04-14
      • 1970-01-01
      • 2016-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-12
      相关资源
      最近更新 更多