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

Reply via email to