可以动态更改Perl的Log :: Log4perl的日志级别而无需更新配置吗?

时间:2011-05-10 16:05:51

标签: perl apache logging mod-perl log4perl

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

我想更改特定appender的日志级别,但更改配置太尴尬了,因为它必须通过我们的部署过程才能上线。

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

2 个答案:

答案 0 :(得分:11)

如果您从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.

这是Changing the Log Level on a Logger中的Log::Log4perl docs部分。

答案 1 :(得分:2)

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

$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});