在这个例子中:
$logger->debug({
filter => \&Data::Dumper::Dumper,
value => $ref
});
我可以漂亮地打印我的参考文献而不是ARRAY(0xFFDFKDJ). 但是每次都打那么长的代码太无聊了。我只是想:
$logger->preprocessor({
filter => \&Data::Dumper::Dumper,
value => $ref
});
$logger->debug( $ref, $ref2 );
$logger->info( $array );
和$ref, $ref2, 和$array将被 Data::Dumper 转储。
有没有办法做到这一点?
UPD
在你的回答的帮助下,我做了补丁
现在你只需:
log4perl.appender.A1.layout=FallbackLayout
log4perl.appender.A1.layout.chain=PatternLayout
log4perl.appender.A1.layout.chain.ConversionPattern=%m%n
log4perl.appender.A1.warp_message = sub { $#_ = 2 if @_ > 3; \
return @_; }
# OR
log4perl.appender.A1.warp_message = main::warp_my_message
sub warp_my_message {
my( @chunks ) = @_;
use Data::Dump qw/ pp /;
for my $msg ( @chunks ) {
$msg = pp $msg if ref $msg;
}
return @chunks;
}
UPD2
或者你可以使用这个小模块
log4perl.appender.SomeAPP.warp_message = Preprocess::Messages::msg_filter
log4perl.appender.SomeAPP.layout = Preprocess::Messages
package Preprocess::Messages;
sub msg_filter {
my @chunks = @_;
for my $msg ( @chunks ) {
$msg = pp $msg if ref $msg;
}
return @chunks;
};
sub render {
my $self = shift;
my $layout = Log::Log4perl::Layout::PatternLayout->new(
'%d %P %p> %c %F:%L %M%n %m{indent=2}%n%n'
);
$_[-1] += 1; # increase level of the caller
return $layout->render( join $Log::Log4perl::JOIN_MSG_ARRAY_CHAR, @{ shift() }, @_ );
}
sub new {
my $class = shift;
$class = ref ($class) || $class;
return bless {}, $class;
}
1;
是的,当然你可以设置 'warp_message = 0' 并将 msg_filter 和 render 结合在一起。
log4perl.appender.SomeAPP.warp_message = 0
log4perl.appender.SomeAPP.layout = Preprocess::Messages
sub render {
my($self, $message, $category, $priority, $caller_level) = @_;
my $layout = Log::Log4perl::Layout::PatternLayout->new(
'%d %P %p> %c %F:%L %M%n %m{indent=2}%n%n'
);
for my $item ( @{ $message } ) {
$item = pp $item if ref $item;
}
$message = join $Log::Log4perl::JOIN_MSG_ARRAY_CHAR, @$message;
return $layout->render( $message, $category, $priority, $caller_level+1 );
}