Re: [log4perl-devel] $Log::Log4perl::caller_depth, layout %c and %T, and category
On Sun, 30 Jan 2011, David Christensen wrote: I'm not certain if %T is doing the right thing (?). You said there might be a bug. Do you mean that the: Should be fixed in Log4perl 1.32 on CPAN, give it a try. -- Mike Mike Schilli m...@perlmeister.com -- Free Software Download: Index, Search Analyze Logs and other IT data in Real-Time with Splunk. Collect, index and harness all the fast moving IT data generated by your applications, servers and devices whether physical, virtual or in the cloud. Deliver compliance at lower cost and gain new business insights. http://p.sf.net/sfu/splunk-dev2dev ___ log4perl-devel mailing list log4perl-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/log4perl-devel
Re: [log4perl-devel] $Log::Log4perl::caller_depth, layout %c and %T, and category
On Sun, 23 Jan 2011, David Christensen wrote: I've found that: $Log::Log4perl::caller_depth ... does not seem to affect the following layout placeholders: %c Category of the logging event %T A stack trace of functions called Hi David, sorry for the delay. There's a subtle difference between the package class hierarchy in your application and Log4perl's categories: While they're almost always the same, they are in fact independent concepts. That's is why %c does not change automatically when you set caller_depth, because caller_depth refers to the package hierarchy, while %c refers to the Log4perl category. There's a section in the Log4perl manual that talks about this (not easy to find, though): http://search.cpan.org/~mschilli/Log-Log4perl-1.31/lib/Log/Log4perl.pm#Using_Log::Log4perl_with_wrapper_functions_and_classes If you scroll down to Also, note that if you're writing a subclass of Log4perl, it talks about using Log::Log4perl-wrapper_register(__PACKAGE__); to register a wrapper class, so that get_logger() skips it and uses the application's class as a category instead. Note that if you're using qw(:easy), you need to use package Helper; BEGIN { Log::Log4perl-wrapper_register(__PACKAGE__); }; use Log::Log4perl qw(:easy); to make sure Log4perl's easy mode stealth loggers are set up correctly. With regards to %T, I think that's a bug, I'll investigate. Hope that helps. -- Mike Mike Schilli m...@perlmeister.com How do I write a helper function that does affect %c, %T, and category -- e.g. so that calls to my helper logger functions are handled by Log::Log4perl the same way that calls to Log::Log4perl logger functions are handled? TIA, David 2011-01-23 14:30:18 dpchrist@p43400e ~/sandbox $ cat log4perl-easy #!/usr/bin/perl $! = 1; # package Foo; # use strict; use warnings; use Log::Log4perl qw(:easy); sub foo { DEBUG( @_, 'foo', __LINE__); Helper::help(@_, 'foo', __LINE__); } ### package Helper; ### use strict; use warnings; use Log::Log4perl qw(:easy); sub help { local $Log::Log4perl::caller_depth = $Log::Log4perl::caller_depth + 1; DEBUG(@_, 'help', __LINE__); } # package main; # use strict; use warnings; use Log::Log4perl qw(:easy); Log::Log4perl-easy_init( { layout= '%%c %c %n' . '%%C %C %n' . '%%d %d %n' . '%%F %F %n' . '%%H %H %n' . '%%l %l %n' . '%%L %L %n' . '%%m %m %n' . '%%M %M %n' . '%%p %p %n' . '%%P %P %n' . '%%r %r %n' ### %R is broken in Log::Log4perl version 1.16 ### Invalid conversion in sprintf: %R at /usr/share/perl5/Log/Log4perl/Layout/PatternLayout.pm line 286. # . '%%R %R %n' . '%%T %T %n' . '%%x %x %n', }); print ### call DEBUG()\n; DEBUG( 'main', __LINE__); print ### call Foo::foo()\n; Foo::foo('main', __LINE__); print ### call Helper::help()\n; Helper::help('main', __LINE__); 2011-01-23 14:30:20 dpchrist@p43400e ~/sandbox $ perl log4perl-easy ### call DEBUG() %c main %C main %d 2011/01/23 14:30:24 %F log4perl-easy %H p43400e %l main:: log4perl-easy (57) %L 57 %m main57 %M main:: %p DEBUG %P 5030 %r 41 %T Log::Log4perl::__ANON__('main', 57) called at log4perl-easy line 57 %x [undef] ### call Foo::foo() %c Foo %C Foo %d 2011/01/23 14:30:24 %F log4perl-easy %H p43400e %l Foo::foo log4perl-easy (12) %L 12 %m main59foo12 %M Foo::foo %p DEBUG %P 5030 %r 45 %T Foo::foo('main', 59) called at log4perl-easy line 59 %x [undef] %c Helper %C Foo %d 2011/01/23 14:30:24 %F log4perl-easy %H p43400e %l Foo::foo log4perl-easy (13) %L 13 %m main59foo13help26 %M Foo::foo %p DEBUG %P 5030 %r 45 %T Helper::help('main', 59, 'foo', 13) called at log4perl-easy line 13, Foo::foo('main', 59) called at log4perl-easy line 59 %x [undef] ### call Helper::help() %c Helper %C main %d 2011/01/23 14:30:24 %F log4perl-easy %H p43400e %l main:: log4perl-easy (61) %L 61 %m main61help26 %M main:: %p DEBUG %P 5030 %r 46 %T Helper::help('main', 61) called at log4perl-easy line 61 %x [undef] 2011-01-23 14:22:11 dpchrist@p43400e ~/sandbox $ cat log4perl-easy-category #!/usr/bin/perl $! = 1; # package Foo; # use strict; use warnings; use Log::Log4perl qw(:easy); sub foo { DEBUG( @_, 'foo', __LINE__); Helper::help(@_, 'foo', __LINE__); } ### package Helper; ### use strict; use warnings; use Log::Log4perl qw(:easy); sub help { local $Log::Log4perl::caller_depth = $Log::Log4perl::caller_depth + 1; DEBUG(@_, 'help', __LINE__); } # package main; # use strict; use
Re: [log4perl-devel] $Log::Log4perl::caller_depth, layout %c and %T, and category
Mike Schilli wrote: There's a section in the Log4perl manual thattalks about this (not easy to find, though): http://search.cpan.org/~mschilli/Log-Log4perl-1.31/lib/Log/Log4perl.pm#Using_Log::Log4perl_with_wrapper_functions_and_classes Thank you for the reply. :-) Yes, I read that. Note that if you're using qw(:easy), you need to use package Helper; BEGIN { Log::Log4perl-wrapper_register(__PACKAGE__); }; use Log::Log4perl qw(:easy); That code doesn't work on my system: 2011-01-30 14:08:11 dpchrist@p43400e ~/sandbox $ cat log4perl-helper.pl #!/usr/bin/perl package Helper; BEGIN { Log::Log4perl-wrapper_register(__PACKAGE__); }; use Log::Log4perl qw(:easy); 2011-01-30 14:08:16 dpchrist@p43400e ~/sandbox $ perl log4perl-helper.pl Can't locate object method wrapper_register via package Log::Log4perl (perhaps you forgot to load Log::Log4perl?) at log4perl-helper.pl line 4. BEGIN failed--compilation aborted at log4perl-helper.pl line 5. Putting the 'use' statement before the 'BEGIN' statement makes Perl happy, but %c still shows the Helper package, not 'main': 2011-01-30 14:22:44 dpchrist@p43400e ~/sandbox $ nl log4perl-helper2.pl 1 #!/usr/bin/perl 2 package Helper; 3 use Log::Log4perl qw(:easy); 4 BEGIN { 5 Log::Log4perl-wrapper_register(__PACKAGE__); 6 }; 7 sub help { DEBUG(__FILE__, __LINE__, ' ', @_) } 8 package main; 9 use Log::Log4perl qw(:easy); 10 Log::Log4perl-easy_init({layout='%c %m %n'}); 11 DEBUG(__FILE__, __LINE__); 12 Helper::help(__FILE__, __LINE__); 2011-01-30 14:23:00 dpchrist@p43400e ~/sandbox $ perl log4perl-helper2.pl main log4perl-helper2.pl11 Helper log4perl-helper2.pl7 log4perl-helper2.pl12 Any suggestions? David 2011-01-30 14:23:03 dpchrist@p43400e ~/sandbox $ cat /etc/debian_version 5.0.8 2011-01-30 14:24:04 dpchrist@p43400e ~/sandbox $ perl -v This is perl, v5.10.0 built for i486-linux-gnu-thread-multi Copyright 1987-2007, Larry Wall Perl may be copied only under the terms of either the Artistic License or the GNU General Public License, which may be found in the Perl 5 source kit. Complete documentation for Perl, including FAQ lists, should be found on this system using man perl or perldoc perl. If you have access to the Internet, point your browser at http://www.perl.org/, the Perl Home Page. 2011-01-30 14:24:06 dpchrist@p43400e ~/sandbox $ perl -MLog::Log4perl -e 'print $Log::Log4perl::VERSION, \n' 1.31 -- Special Offer-- Download ArcSight Logger for FREE (a $49 USD value)! Finally, a world-class log management solution at an even better price-free! Download using promo code Free_Logger_4_Dev2Dev. Offer expires February 28th, so secure your free ArcSight Logger TODAY! http://p.sf.net/sfu/arcsight-sfd2d ___ log4perl-devel mailing list log4perl-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/log4perl-devel
Re: [log4perl-devel] $Log::Log4perl::caller_depth, layout %c and %T, and category
On Sun, 30 Jan 2011, David Christensen wrote: Putting the 'use' statement before the 'BEGIN' statement makes Perl happy, but %c still shows the Helper package, not 'main': Ugh, that doesn't work in :easy mode, sorry about that. What you want to do instead is use the long form with get_logger(): package Helper; use Log::Log4perl qw(get_logger); Log::Log4perl-wrapper_register(__PACKAGE__); sub help { get_logger()-debug(__FILE__, -, __LINE__, ' ', @_) } package Foo; sub foo { Helper::help(blah); } package main; use Log::Log4perl qw(:easy); Log::Log4perl-easy_init({layout='%c %m %n'}); DEBUG(__FILE__, -, __LINE__); Helper::help(__FILE__, -, __LINE__); Foo::foo(); -- Mike Mike Schilli m...@perlmeister.com -- Special Offer-- Download ArcSight Logger for FREE (a $49 USD value)! Finally, a world-class log management solution at an even better price-free! Download using promo code Free_Logger_4_Dev2Dev. Offer expires February 28th, so secure your free ArcSight Logger TODAY! http://p.sf.net/sfu/arcsight-sfd2d ___ log4perl-devel mailing list log4perl-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/log4perl-devel
Re: [log4perl-devel] $Log::Log4perl::caller_depth, layout %c and %T, and category
Mike Schilli wrote: We get tons of spam on this list, so it's moderated. That's what I thought. I'll post to the list and BCC you. What you want to do instead is use the long form with get_logger(): package Helper; use Log::Log4perl qw(get_logger); Log::Log4perl-wrapper_register(__PACKAGE__); sub help { get_logger()-debug(__FILE__, -, __LINE__, ' ', @_) } That solves both %c and 'category' -- thanks! The 'category' filtering will be very useful. :-) I'm not certain if %T is doing the right thing (?). You said there might be a bug. Do you mean that the: ... Helper::help(...) called at ... stances should be ... Log::Log4perl::__ANON__(...) called at ... ? It's not a burning issue for me; I can use the output as is. David 2011-01-30 19:53:41 dpchrist@p43400e ~/sandbox $ nl log4perl-helper4.pl 1 #!/usr/bin/perl 2 package Helper; 3 use Log::Log4perl qw(get_logger); 4 Log::Log4perl-wrapper_register(__PACKAGE__); 5 sub help { get_logger()-debug(@_, ' ', __FILE__, '-', __LINE__); } 6 package Foo; 7 sub foo { Helper::help(@_, ' ', __FILE__, '-', __LINE__); } 8 package main; 9 use Log::Log4perl qw(:easy); 10 Log::Log4perl-easy_init({layout='%m %T %n'}); 11 DEBUG( __FILE__, '-', __LINE__); 12 print \n; 13 Helper::help(__FILE__, '-', __LINE__); 14 print \n; 15 Foo::foo(__FILE__, '-', __LINE__); 2011-01-30 19:55:32 dpchrist@p43400e ~/sandbox $ perl log4perl-helper4.pl log4perl-helper4.pl-13 Log::Log4perl::__ANON__('log4perl-helper4.pl', '-', 13) called at log4perl-helper4.pl line 13 log4perl-helper4.pl-15 log4perl-helper4.pl-5 Helper::help('log4perl-helper4.pl', '-', 15) called at log4perl-helper4.pl line 15 log4perl-helper4.pl-17 log4perl-helper4.pl-8 log4perl-helper4.pl-5 Helper::help('log4perl-helper4.pl', '-', 17, ' ', 'log4perl-helper4.pl', '-', 8) called at log4perl-helper4.pl line 8, Foo::foo('log4perl-helper4.pl', '-', 17) called at log4perl-helper4.pl line 17 2011-01-30 19:55:35 dpchrist@p43400e ~/sandbox $ cat /etc/debian_version 5.0.8 2011-01-30 19:55:44 dpchrist@p43400e ~/sandbox $ perl -v This is perl, v5.10.0 built for i486-linux-gnu-thread-multi Copyright 1987-2007, Larry Wall Perl may be copied only under the terms of either the Artistic License or the GNU General Public License, which may be found in the Perl 5 source kit. Complete documentation for Perl, including FAQ lists, should be found on this system using man perl or perldoc perl. If you have access to the Internet, point your browser at http://www.perl.org/, the Perl Home Page. 2011-01-30 19:55:46 dpchrist@p43400e ~/sandbox $ perl -MLog::Log4perl -e 'print $Log::Log4perl::VERSION, \n' 1.31 -- Special Offer-- Download ArcSight Logger for FREE (a $49 USD value)! Finally, a world-class log management solution at an even better price-free! Download using promo code Free_Logger_4_Dev2Dev. Offer expires February 28th, so secure your free ArcSight Logger TODAY! http://p.sf.net/sfu/arcsight-sfd2d ___ log4perl-devel mailing list log4perl-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/log4perl-devel
[log4perl-devel] $Log::Log4perl::caller_depth, layout %c and %T, and category
log4perl-devel: I'm a new Log::Log4perl user and am trying to create some Log4perl helper logger functions. I've found that: $Log::Log4perl::caller_depth seems to affect the following layout placeholders: %C Fully qualified package (or class) name of the caller %l Fully qualified name of the calling method followed by the callers source the file name and line number between parentheses. %L Line number within the file where the log statement was issued %M Method or function where the logging request was issued but it does not seem to affect the following layout placeholders: %c Category of the logging event %T A stack trace of functions called nor the following argument to easy_init(): category How do I write a helper function that does affect %c, %T, and category -- e.g. so that calls to my helper logger functions are handled by Log::Log4perl the same way that calls to Log::Log4perl logger functions are handled? TIA, David 2011-01-23 14:30:18 dpchrist@p43400e ~/sandbox $ cat log4perl-easy #!/usr/bin/perl $! = 1; # package Foo; # use strict; use warnings; use Log::Log4perl qw(:easy); sub foo { DEBUG( @_, 'foo', __LINE__); Helper::help(@_, 'foo', __LINE__); } ### package Helper; ### use strict; use warnings; use Log::Log4perl qw(:easy); sub help { local $Log::Log4perl::caller_depth = $Log::Log4perl::caller_depth + 1; DEBUG(@_, 'help', __LINE__); } # package main; # use strict; use warnings; use Log::Log4perl qw(:easy); Log::Log4perl-easy_init( { layout = '%%c %c %n' . '%%C %C %n' . '%%d %d %n' . '%%F %F %n' . '%%H %H %n' . '%%l %l %n' . '%%L %L %n' . '%%m %m %n' . '%%M %M %n' . '%%p %p %n' . '%%P %P %n' . '%%r %r %n' ### %R is broken in Log::Log4perl version 1.16 ### Invalid conversion in sprintf: %R at /usr/share/perl5/Log/Log4perl/Layout/PatternLayout.pm line 286. #. '%%R %R %n' . '%%T %T %n' . '%%x %x %n', }); print ### call DEBUG()\n; DEBUG( 'main', __LINE__); print ### call Foo::foo()\n; Foo::foo('main', __LINE__); print ### call Helper::help()\n; Helper::help('main', __LINE__); 2011-01-23 14:30:20 dpchrist@p43400e ~/sandbox $ perl log4perl-easy ### call DEBUG() %c main %C main %d 2011/01/23 14:30:24 %F log4perl-easy %H p43400e %l main:: log4perl-easy (57) %L 57 %m main57 %M main:: %p DEBUG %P 5030 %r 41 %T Log::Log4perl::__ANON__('main', 57) called at log4perl-easy line 57 %x [undef] ### call Foo::foo() %c Foo %C Foo %d 2011/01/23 14:30:24 %F log4perl-easy %H p43400e %l Foo::foo log4perl-easy (12) %L 12 %m main59foo12 %M Foo::foo %p DEBUG %P 5030 %r 45 %T Foo::foo('main', 59) called at log4perl-easy line 59 %x [undef] %c Helper %C Foo %d 2011/01/23 14:30:24 %F log4perl-easy %H p43400e %l Foo::foo log4perl-easy (13) %L 13 %m main59foo13help26 %M Foo::foo %p DEBUG %P 5030 %r 45 %T Helper::help('main', 59, 'foo', 13) called at log4perl-easy line 13, Foo::foo('main', 59) called at log4perl-easy line 59 %x [undef] ### call Helper::help() %c Helper %C main %d 2011/01/23 14:30:24 %F log4perl-easy %H p43400e %l main:: log4perl-easy (61) %L 61 %m main61help26 %M main:: %p DEBUG %P 5030 %r 46 %T Helper::help('main', 61) called at log4perl-easy line 61 %x [undef] 2011-01-23 14:22:11 dpchrist@p43400e ~/sandbox $ cat log4perl-easy-category #!/usr/bin/perl $! = 1; # package Foo; # use strict; use warnings; use Log::Log4perl qw(:easy); sub foo { DEBUG( @_, 'foo', __LINE__); Helper::help(@_, 'foo', __LINE__); } ### package Helper; ### use strict; use warnings; use Log::Log4perl qw(:easy); sub help { local $Log::Log4perl::caller_depth = $Log::Log4perl::caller_depth + 1; DEBUG(@_, 'help', __LINE__); } # package main; # use strict; use warnings; use Log::Log4perl qw(:easy); print ### no category\n; Log::Log4perl-easy_init( {layout='%m category=%c %n'} ); DEBUG( 'main', __LINE__); Foo::foo('main', __LINE__); Helper::help('main', __LINE__); print ### category 'main'\n; Log::Log4perl-easy_init( {layout='%m category=%c %n', category='main'} ); DEBUG( 'main', __LINE__); Foo::foo('main', __LINE__); Helper::help('main', __LINE__); print ### category 'Foo'\n; Log::Log4perl-easy_init( {layout='%m category=%c %n', category='Foo'} ); DEBUG( 'main', __LINE__); Foo::foo('main', __LINE__); Helper::help('main', __LINE__); 2011-01-23 14:22:51 dpchrist@p43400e ~/sandbox $ perl log4perl-easy-category ### no category main40 category=main main41foo12 category=Foo main41foo13help26 category=Helper main42help26 category=Helper ### category