Hi Dave,

you're defining different loggers, but what you really want is define
different appenders attached to a single logger.

A logger has a category ("" or "main" or "Foo::Bar"), which determines
which package namespace to accept messages from, and a set of appenders
which it forwards the message to after it determines it should be logged
because it exceeds the required level threshold.

Your :easy configuration defines two loggers with identical categories,
which results in second logger clobbering the first one :).
Unfortunately, Log4perl doesn't warn you if you do that in easy mode,
had you used a configuration file to set up your configuration, 
Log4perl would have warned you:

   log4perl.category redefined at PropertyConfigurator.pm line 98.

Now, unfortunately, there's no way to do what you want in easy mode,
but you need to use a standard configuration file or string instead.

The following snippet defines one logger, which has two appenders
attached to it:

     use Log::Log4perl qw(:easy);
     Log::Log4perl->init( \<<EOT );
     log4perl.logger = TRACE, Screen, File

     log4perl.appender.Screen   = Log::Log4perl::Appender::Screen
     log4perl.appender.Screen.layout = SimpleLayout

     log4perl.appender.File   = Log::Log4perl::Appender::File
     log4perl.appender.File.filename = test.log
     log4perl.appender.File.layout = SimpleLayout
     log4perl.appender.Screen.Threshold = INFO
     EOT

     INFO  "Goes to screen and file";
     TRACE "Only goes to file";

The logger's level is trace, so that it forwards all messages trace and 
above to both appenders, but the file appender blocks everything below 
INFO with its threshold setting.

Hope that helps!

-- 
-- Mike

Mike Schilli
m...@perlmeister.com

On Wed, 18 Dec 2013, Dave Pointon wrote:


> Hi gents ,
>
> I think that I'm experiencing some unexpected behaviour when using
> easy_init() with multiple logger definitions (as suggested in the
> perldoc), viz ... the reporting level is apparently determined by the
> last of the definitions c/w being individually applicable e.g.
>
> With the call
>
> Log::Log4perl->easy_init(
>        {
>            name    => 'LOG',
>            file    => ">$LOGGER_FNAME",
>            layout  => $log_layout,
>            level   => $TRACE,
>        },
>        {
>            name    => 'SCR',
>            file    => 'STDOUT',
>            layout  => $log_layout,
>            level   => $INFO,
>        },
>    );
>
> both logs i.e. STDOUT and the file, contain only INFO and above
> messages, whereas the call
>
> Log::Log4perl->easy_init(
>        {
>            name    => 'SCR',
>            file    => 'STDOUT',
>            layout  => $log_layout,
>            level   => $INFO,
>        },
>        {
>            name    => 'LOG',
>            file    => ">$LOGGER_FNAME",
>            layout  => $log_layout,
>            level   => $TRACE,
>        },
>    );
>
> results in all messages being output to both logs.
>
> In both of the above cases, I expected messages of INFO and above to
> STDOUT and all message to the log file, so the question is: Is this a
> mis-understanding on my part, or is there an actual defect here ?
>
> TIA & best rgds ,
>
>

------------------------------------------------------------------------------
Rapidly troubleshoot problems before they affect your business. Most IT 
organizations don't have a clear picture of how application performance 
affects their revenue. With AppDynamics, you get 100% visibility into your 
Java,.NET, & PHP application. Start your 15-day FREE TRIAL of AppDynamics Pro!
http://pubads.g.doubleclick.net/gampad/clk?id=84349831&iu=/4140/ostg.clktrk
_______________________________________________
log4perl-devel mailing list
log4perl-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/log4perl-devel

Reply via email to