From: Garrett, P. (MAN-Corporate) <Phi...@co...> - 2005-02-16 23:07:19
|
I'm trying to wrap get_logger() in a custom module, for various reasons. I have set $Log::Log4perl::caller_depth to 1 to allow for the 1 extra level of indirection. However, Log4perl still returns a logger for the context of the wrapper, not the calling code. Changing Log::Log4perl::get_logger to pass $caller_depth to the caller() function makes it work like I expected, however I'm not sure that my expectations were correct. Can you confirm what it *should* do? This small program exhibits my problem: ############################################################### use Log::Log4perl; $config = qq{ log4perl.appender.Wrapper=Log::Log4perl::Appender::Screen log4perl.appender.Wrapper.layout=PatternLayout log4perl.appender.Wrapper.layout.ConversionPattern=WRAPPER[%m]%n log4perl.appender.Caller=Log::Log4perl::Appender::Screen log4perl.appender.Caller.layout=PatternLayout log4perl.appender.Caller.layout.ConversionPattern=CALLER[%m]%n log4perl.category.Wrapper=DEBUG, Wrapper log4perl.category.Caller=DEBUG, Caller }; Log::Log4perl->init(\$config); { package Wrapper; sub get_logger { # get logger for our caller, not us. local $Log::Log4perl::caller_depth = 1; return Log::Log4perl::get_logger(); } } { package Caller; my $logger = Wrapper::get_logger(); $logger->info("this should be Caller's category"); } ############################################################### This patch fixes my problem. (against version 0.51) --- Log4perl.pm.orig 2005-02-16 11:38:02.733776000 -0500 +++ Log4perl.pm 2005-02-16 11:38:52.834926000 -0500 @@ -300,10 +300,10 @@ if(!defined $class) { # Called as ::get_logger() - unshift(@args, scalar caller()); + unshift(@args, scalar caller($caller_depth)); } elsif($class eq __PACKAGE__ and !defined $args[0]) { # Called as ->get_logger() - unshift(@args, scalar caller()); + unshift(@args, scalar caller($caller_depth)); } elsif($class ne __PACKAGE__) { # Called as ::get_logger($category) unshift(@args, $class); |