0

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

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

这可能吗?任何人都可以帮忙吗?

提前致谢,

4

1 回答 1

0

您可以通过在 conf 文件中指定自定义 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'
于 2012-06-22T06:01:32.473 回答