I am trying to replace a pattern in the log message before it gets logged on to the file. The logger uses the Perl Module Log::Log4perl
. I see that there is only a Filter option available in this module, which does not solve my problem.
Actually, this is what I want to do. Let us say my log messages are "Testing the logger module"
and "Developing the logger module"
. I want to replace the string 'module'
to 'package'
in the message. So, whenever there is a string 'module' in the log message, it should be replaced to 'package' before logging. And I want to use Perl's regex find/replace here, which will allow me to replace different patterns.
Is this possible? Can anyone help?
Thanks in advance,
You can do this by specifying a custom cspec in your conf file.
# 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
And your code shouldn't need to change:
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'