Mike Schilli wrote: > On Wed, 9 Dec 2009, Martin Evans wrote: > >> Since the upgrade we are getting no logging in one of the files we >> expected to get it. After a bit of searching around I discovered the >> module we were using was doing this: >> >> local $Log::Log4perl::caller_depth = $Log::Log4perl::caller_depth + 1; >> $h{logger} = Log::Log4perl->get_logger(); >> and the fix was to change the order of those lines. > > Thanks for reporting this, although I have a hard time imaginining how > increasing the caller_depth and then getting a logger would be different > from what you'd get if you did it in the reverse order. Not to mention > that it's puzzling why this would change the logging behavior, as > caller_depth is used mainly for cosmetic reasons in certain features > of the pattern layout. > > Can you provide a snippet of code that reproduces the problem in full? > That would really help track down the root of the problem. > > Thanks! > > -- Mike > > Mike Schilli > m...@perlmeister.com > >
It was ending up with "main" and the category in the following code instead of DBIx::Log4perl. sub get_logger { # Get an instance (shortcut) ################################################## # get_logger() can be called in the following ways: # # (1) Log::Log4perl::get_logger() => () # (2) Log::Log4perl->get_logger() => ("Log::Log4perl") # (3) Log::Log4perl::get_logger($cat) => ($cat) # # (5) Log::Log4perl->get_logger($cat) => ("Log::Log4perl", $cat) # (6) L4pSubclass->get_logger($cat) => ("L4pSubclass", $cat) # Note that (4) L4pSubclass->get_logger() => ("L4pSubclass") # is indistinguishable from (3) and therefore can't be allowed. # Wrapper classes always have to specify the category explicitely. my $category; if(@_ == 0) { # 1 $category = scalar caller($Log::Log4perl::caller_depth); } elsif(@_ == 1) { # 2, 3 if($_[0] eq __PACKAGE__) { # 2 $category = scalar caller($Log::Log4perl::caller_depth); } else { $category = $_[0]; } } else { # 5, 6 $category = $_[1]; } # Delegate this to the logger module return Log::Log4perl::Logger->get_logger($category); } Here is an example: 1.pl ==== use Log::Log4perl qw(get_logger :levels); use DBIx::Log4perl; Log::Log4perl->init_and_watch('x.conf', 60); my $a = DBIx::Log4perl->new(); Log4perl.pm (put this in a dir called DBIx) =========== package DBIx::Log4perl; sub new { local $Log::Log4perl::caller_depth = $Log::Log4perl::caller_depth + 1; $h = Log::Log4perl->get_logger(); $h->debug("log msg"); } 1; x.conf ====== log4perl.logger=ERROR log4perl.logger.Server = INFO log4perl.logger.DBIx.Log4perl=DEBUG, X1 log4perl.appender.X1=Log::Log4perl::Appender::File log4perl.appender.X1.filename=dbix.log log4perl.appender.X1.mode=append log4perl.appender.X1.utf8 = 1 log4perl.appender.X1.umask = sub { 0002 } log4perl.appender.X1.layout=Log::Log4perl::Layout::PatternLayout log4perl.appender.X1.layout.ConversionPattern=%d %p> %F{1}:%L %M - %m%n then run perl -I/dir_where_DBIx_dir_is 1.pl nothing comes out in log. Change the depth after get_logger and it works. Martin -- Martin J. Evans Easysoft Limited http://www.easysoft.com ------------------------------------------------------------------------------ Return on Information: Google Enterprise Search pays you back Get the facts. http://p.sf.net/sfu/google-dev2dev _______________________________________________ log4perl-devel mailing list log4perl-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/log4perl-devel