You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4j-user@logging.apache.org by Detering Dirk <de...@iskv.de> on 2007/01/25 13:16:23 UTC

Changing loglevel at runtime (systemwide)

Hello all,

I subscribed to this list to get some help regarding 
a problem with conditional level switching we encountered 
in our development team.

Let me first explain what we do and why.

Background:

Application:  A code generator, doing two steps: 
Model validation and code generation for each class in 
the model (more or less). The generator is developed in 
our team but used in many other application development 
teams.

Problem:
The validation may be incomplete, causing the generator 
to throw runtime exceptions at unexpected locations during 
the generation step.
In this case, the stack trace isn't very helpful, as it 
documents somehow _where_ the problem occurred, but not 
clearly _why_  (means: which model element caused the 
problem). This is partly due to Velocity.

Current solution:
The time consuming solution is to reconfigure the log settings to
get DEBUG infos from different generator classes during runtime,
and restart the whole generation.

   Drawback:  
   * A generator developer has to be involved to analyse
     the stack and do the right debug configurations
   * The complete generator run has to be repeated
   * When switching a Logger to DEBUG, it _always_ 
     logs what it does, not only for the problematic part/element 
     of the input model. So the output has to be filtered to 
     separate the relevant information from noise.

Perhaps better concept:
Our intention was to catch the thrown exceptions at the location
where the model is iterated and the generation triggered for each 
element, and to retry the generation after setting the whole system 
into DEBUG mode - and setting it back to its former state after 
catching the exception again(!)

   Advantage:
   * We would get a verbose track of what the system does, 
     but only with the critical model element, not with all 
     others.
   * The debug info would automatically be created during the 
     first run by the app. developer. So no need to completely
     rerun, no need to configure, no need to involve our dev.
     team at this stage.
     

Here's our log4j problem why I post now:

As the basic configuration is just complex, involving many
loggers and appenders, we can't only set one or two logger 
into debug mode. Settings at some upper level in the 
hierarchy don't help, as some loggers much deeper are configured
explicitly and keep their own setting.

Reconfiguring with another property set would presumably
cause rolling file appenders to create a new generation
after restoring the configuration (?).

So we tried to write a RepositorySelector do retrieve another
(much simpler) hierarchy in case the system goes into debug.

But this does not work either, as the Loggers are instanciated
and kept in static variables of classes (as recommended)
which are put into caches _before_ the system switches to DEBUG, 
i.e.: The second hierarchy is mostly never queried, each instance
knows its logger.

So, what would be the right way to achieve a systemwide
switch to debug level and a reset to normal configuration
afterwards?

Any hints are welcome

KR
Dirk Detering

--
ISKV 
Paul-Klinger-Straße 15
45127 Essen
Telefon  +49-(0)-201-1094-0
Fax      +49-(0)-201-1094-444 
< http://www.iskv.de/>

---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-user-unsubscribe@logging.apache.org
For additional commands, e-mail: log4j-user-help@logging.apache.org


Re: Changing loglevel at runtime (systemwide)

Posted by Curt Arnold <ca...@apache.org>.
Manipulating the repository threshold might accomplish what you are  
trying to do.  Every event is evaluated relative to the repository  
threshold before being evaluated against logger and appender  
thresholds.  If you set the repository threshold to "info" but set  
the loggers and appenders to "debug", only "info" and higher messages  
will be processed until the threshold is lowered to "debug".

The repository threshold can be specified in a configuration file:

<log4j:configuration threshold="info"...>

or

log4j.threshold=info

or by code:

logger.getLoggerRepository().setThreshold(Level.DEBUG);



---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-user-unsubscribe@logging.apache.org
For additional commands, e-mail: log4j-user-help@logging.apache.org


Re: Changing loglevel at runtime (systemwide)

Posted by James Stauffer <st...@gmail.com>.
Would it work to have two output files(or sets of files) -- one at
normal level and one at debug level?  Then if you don't need the debug
output just delete the debug logs.

On 1/25/07, Detering Dirk <de...@iskv.de> wrote:
> Hello all,
>
> I subscribed to this list to get some help regarding
> a problem with conditional level switching we encountered
> in our development team.
>
> Let me first explain what we do and why.
>
> Background:
>
> Application:  A code generator, doing two steps:
> Model validation and code generation for each class in
> the model (more or less). The generator is developed in
> our team but used in many other application development
> teams.
>
> Problem:
> The validation may be incomplete, causing the generator
> to throw runtime exceptions at unexpected locations during
> the generation step.
> In this case, the stack trace isn't very helpful, as it
> documents somehow _where_ the problem occurred, but not
> clearly _why_  (means: which model element caused the
> problem). This is partly due to Velocity.
>
> Current solution:
> The time consuming solution is to reconfigure the log settings to
> get DEBUG infos from different generator classes during runtime,
> and restart the whole generation.
>
>    Drawback:
>    * A generator developer has to be involved to analyse
>      the stack and do the right debug configurations
>    * The complete generator run has to be repeated
>    * When switching a Logger to DEBUG, it _always_
>      logs what it does, not only for the problematic part/element
>      of the input model. So the output has to be filtered to
>      separate the relevant information from noise.
>
> Perhaps better concept:
> Our intention was to catch the thrown exceptions at the location
> where the model is iterated and the generation triggered for each
> element, and to retry the generation after setting the whole system
> into DEBUG mode - and setting it back to its former state after
> catching the exception again(!)
>
>    Advantage:
>    * We would get a verbose track of what the system does,
>      but only with the critical model element, not with all
>      others.
>    * The debug info would automatically be created during the
>      first run by the app. developer. So no need to completely
>      rerun, no need to configure, no need to involve our dev.
>      team at this stage.
>
>
> Here's our log4j problem why I post now:
>
> As the basic configuration is just complex, involving many
> loggers and appenders, we can't only set one or two logger
> into debug mode. Settings at some upper level in the
> hierarchy don't help, as some loggers much deeper are configured
> explicitly and keep their own setting.
>
> Reconfiguring with another property set would presumably
> cause rolling file appenders to create a new generation
> after restoring the configuration (?).
>
> So we tried to write a RepositorySelector do retrieve another
> (much simpler) hierarchy in case the system goes into debug.
>
> But this does not work either, as the Loggers are instanciated
> and kept in static variables of classes (as recommended)
> which are put into caches _before_ the system switches to DEBUG,
> i.e.: The second hierarchy is mostly never queried, each instance
> knows its logger.
>
> So, what would be the right way to achieve a systemwide
> switch to debug level and a reset to normal configuration
> afterwards?
>
> Any hints are welcome
>
> KR
> Dirk Detering
>
> --
> ISKV
> Paul-Klinger-Straße 15
> 45127 Essen
> Telefon  +49-(0)-201-1094-0
> Fax      +49-(0)-201-1094-444
> < http://www.iskv.de/>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: log4j-user-unsubscribe@logging.apache.org
> For additional commands, e-mail: log4j-user-help@logging.apache.org
>
>


-- 
James Stauffer        http://www.geocities.com/stauffer_james/
Are you good? Take the test at http://www.livingwaters.com/good/

---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-user-unsubscribe@logging.apache.org
For additional commands, e-mail: log4j-user-help@logging.apache.org