2012-06-21 54 views
0

我想在日誌消息登錄到文件之前替換它中的模式。記錄器使用Perl模塊Log::Log4perl。我發現在這個模塊中只有一個Filter選項可用,這並不能解決我的問題。在Perl中使用Log :: Log4perl時,如何在日誌記錄之前替換模式?

其實這就是我想要做的。讓我們說我的日誌消息是"Testing the logger module""Developing the logger module"。我想在郵件中將字符串'module'替換爲'package'。因此,只要日誌消息中有字符串「模塊」,在登錄之前應該將其替換爲「包」。我想在這裏使用Perl的正則表達式查找/替換,這將允許我替換不同的模式。

這可能嗎?誰能幫忙?

由於提前,

+0

請出示一些代碼。你如何調用日誌記錄?你有沒有嘗試過任何東西? – simbabque

回答

0

您可以通過在你的conf文件中指定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' 
+0

謝謝Steve(stevenl)。你的解決方案爲我工作。再次感謝! – MDT

相關問題