[ 
https://issues.apache.org/jira/browse/LOG4J2-865?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14156679#comment-14156679
 ] 

Ralph Goers commented on LOG4J2-865:
------------------------------------

Log Level filtering on Appenders is independent of filtering on LoggerConfigs 
as you might have multiple Appenders configured that you want to filter at 
different levels. 
Rather than calling ctx.getConfiguration() and modifying the existing 
configuration you would be much better off creating a new configuration and 
replacing the existing one with the new one once it is constructed.

The AppenderControl actually contains the level to filter on that is specified 
in the AppenderRef, not on the Appender itself. If you want to change the level 
on the Appender you need to go through the list of appenders held in 
AbstractConfiguration, find the one you want, remove the existing filter and 
then add a new one.  However, this cannot be done atomically so you will be in 
a state momentarily where the Appender has no filter.

The Level in the AppenderControl is final, so the only way to change the level 
is to remove the Appender from the LoggerConfig and re-add it back using the 
new level.  Again, this can't be done atomically.

Although what you are asking for may seem simple, it is really quite 
complicated and is why we would recommend that you create a new Configuration 
with the new levels you want and then replace the old configuration with the 
new one.  Doing it that way means your configuration will never be in a state 
where it is missing items.

> Changing level in LoggerConfig does not change AppenderControl  and does not 
> allow messages at new log level to be logged
> -------------------------------------------------------------------------------------------------------------------------
>
>                 Key: LOG4J2-865
>                 URL: https://issues.apache.org/jira/browse/LOG4J2-865
>             Project: Log4j 2
>          Issue Type: Bug
>          Components: Appenders, Configurators
>    Affects Versions: 2.0.2
>         Environment: Windows7 64bit, Eclipse, Maven
>            Reporter: Andrew Herr
>             Fix For: 2.0.2
>
>
> I am wrapping log4j2 in order to replace the logging backend used in house, 
> so I am configuring the logger and appenders at runtime with calls to the 
> Context, Configuration, and LoggerConfig. I'd like to change the log level on 
> the fly, so I get the LoggerConfig for my named logger and call 
> setLevel(Level) on it, and then updateLoggers in the context. New messages at 
> the new (less severe) level are not logged. Through a debug session, I can 
> see that the level in LoggerConfig is correctly updated, but the 
> AppenderControl still has the old level, so callAppenders denies my event 
> from being logged.
> Code:
> Set up the logger + RollingFileAppender
>         name = logName;
>         level = logLevel;
>         LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
>         Configuration config = ctx.getConfiguration();
>         
>         LoggerConfig loggerConfig = new LoggerConfig(name, level, false);
>         PatternLayout layout = 
> PatternLayout.createLayout(PatternLayout.SIMPLE_CONVERSION_PATTERN, config, 
> null, null, true, false, null, null);
>         
>         OnStartupTriggeringPolicy startupTrigger = 
> OnStartupTriggeringPolicy.createPolicy();
>         SizeBasedTriggeringPolicy sizeTrigger = 
> SizeBasedTriggeringPolicy.createPolicy("25MB");
>         TriggeringPolicy triggerPolicy = 
> CompositeTriggeringPolicy.createPolicy(startupTrigger, sizeTrigger);
>         DefaultRolloverStrategy rolloverStrategy = 
> DefaultRolloverStrategy.createStrategy("5", "1", "min", null, config);
>         RollingFileAppender rollingFileAppender = 
> RollingFileAppender.createAppender(name + ".log", name + ".log.%i", "true", 
> "RollingFile",
>                 "true", "8192", "true", triggerPolicy, rolloverStrategy, 
> layout, null, "true", "false", null, config);
>         rollingFileAppender.start();
>         loggerConfig.addAppender(rollingFileAppender, level, null);
>         config.addLogger(name, loggerConfig);
>         ctx.updateLoggers();
> update the level:
>         LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
>         Configuration config = ctx.getConfiguration();
>         LoggerConfig loggerConfig = config.getLoggerConfig(name);
>         loggerConfig.setLevel(logLevel);
>         ctx.updateLoggers();



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to