Mike Schilli wrote: > Thanks for the detailed description, here's what's happening: > > This change in behavior was caused by a patch introduced with > Log-Log4perl-1.19 in > > > http://github.com/mschilli/log4perl/commit/35d86ae53859424ea3ac357eaf0f15d9e69f4bed > > > in September 2008. A detailed description of the issue at the time is > available in > > http://rt.cpan.org/Ticket/Display.html?id=38356 > > on the request tracker. It fixed problems with the caller_depth, but it > also introduced a change to get_logger() which bumped up the caller() > level to obtain the category (aka package name) of the calling package. > > This is probably a good opportunity to rethink how Log4perl wrapper > classes should be implemented. > > To implement a L4p wrapper class correctly, it needs to provide the > following four methods: > > 1 Wrap::get_logger() > 2 Wrap::get_logger( $package ) > 3 Wrap->get_logger() > 4 Wrap->get_logger( $package ) > > Calls #1 and #3 are supposed to obtain a logger with the category of the > calling package, not the category of the wrapper package. This is > especially difficult in case #3, as Log4perl doesn't know if "Wrap" is > a Log4perl wrapper or if it's the #2 signature where "$package" is an > application package called "Wrap". > > Another complication is that we don't know how "Wrap" is implemented. > Is it relaying the get_logger() call to Log4perl by implementing its own > get_logger function? Or is it simply inheriting from Log4perl? > > I've put together a fix to resolve this, please check out the > documentation: > > > http://github.com/mschilli/log4perl/commit/8ad3fbae60a4667aba848eb545c66339aeff161a > > > As this might break backward compatibility with earlier versions of > Log4perl, I'm interested in hearing what you think about it, feedback > definitely welcome. If I don't hear anything back, it'll go out with the > next release. > > You can play around with the new implementation, here's the tarball: > > http://github.com/mschilli/log4perl/tarball/wrapper_fix > > Also, I've opened a bug on RT to track this issue: > > https://rt.cpan.org/Ticket/Display.html?id=52913 > > Give it a spin! > > -- Mike > > Mike Schilli m...@perlmeister.com
Thank you Mike. I've tried this now and it appears to fix the change in behaviour I reported and does not appear to break anything else I can see. I am now using the tarball you provided and will report if I see anything. I will also update the rt later today. Thanks again Martin -- Martin J. Evans Easysoft Limited http://www.easysoft.com > On Wed, 9 Dec 2009, Martin Evans wrote: > >> 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 >> > > > ------------------------------------------------------------------------------ This SF.Net email is sponsored by the Verizon Developer Community Take advantage of Verizon's best-in-class app development support A streamlined, 14 day to market process makes app distribution fast and easy Join now and get one step closer to millions of Verizon customers http://p.sf.net/sfu/verizon-dev2dev _______________________________________________ log4perl-devel mailing list log4perl-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/log4perl-devel