|
From: Martin E. <mar...@ea...> - 2009-12-09 16:59:16
|
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...@pe...
>
>
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
|