在Perl中使用Log :: Log4perl时,如何在记录之前替换模式?

时间:2012-06-21 13:01:42

标签: perl logging log4perl

我正在尝试在登录到文件之前替换日志消息中的模式。记录器使用Perl模块Log::Log4perl。我看到这个模块中只有一个Filter选项,但这并没有解决我的问题。

实际上,这就是我想要做的。我们说我的日志消息是"Testing the logger module""Developing the logger module"。我想在消息中将字符串'module'替换为'package'。因此,只要日志消息中有字符串'module',就应该在记录之前将其替换为'package'。我想在这里使用Perl的正则表达式替换/替换,这将允许我替换不同的模式。

这可能吗?有人可以帮忙吗?

提前致谢,

1 个答案:

答案 0 :(得分:0)

您可以在配置文件中指定custom cspec来执行此操作。

# basic config to write the log to a file
log4perl.logger.mylog = DEBUG, MyLog
log4perl.appender.MyLog = Log::Log4perl::Appender::File
log4perl.appender.MyLog.filename = my.log

# create a custom cspec called 'A' with an anonymous sub.
# The sub would be called with the following args: $layout, $message, $category, $priority, $caller_level
# Then apply the regex as you like.
log4j.PatternLayout.cspec.A = sub { $_[1] =~ s/module/package/; $_[1] }

# then use the cspec here with '%A'
log4perl.appender.MyLog.layout = Log::Log4perl::Layout::PatternLayout
log4perl.appender.MyLog.layout.ConversionPattern = %A%n

您的代码不需要更改:

use Log::Log4perl;
log::Log4perl::init('log.conf');
my $logger = Log::Log4perl->get_logger('mylog');
$logger->info("Testing the logger module"); # prints 'Testing the logger package'