You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@logging.apache.org by "Mircea Lemnaru (Jira)" <ji...@apache.org> on 2022/01/13 12:30:00 UTC

[jira] [Created] (LOG4J2-3334) Configurator.setLevel adding an incomplete LoggerConfig

Mircea Lemnaru created LOG4J2-3334:
--------------------------------------

             Summary: Configurator.setLevel adding an incomplete LoggerConfig
                 Key: LOG4J2-3334
                 URL: https://issues.apache.org/jira/browse/LOG4J2-3334
             Project: Log4j 2
          Issue Type: Bug
          Components: Core
    Affects Versions: 2.17.1
            Reporter: Mircea Lemnaru


I am trying to set the log levels for my application programatically and I was using the method: *Configurator.setLevel*

 
{code:java}
private static boolean setLevel(final String loggerName, final Level level, final Configuration config) {
    boolean set;
    LoggerConfig loggerConfig = config.getLoggerConfig(loggerName);
    if (!loggerName.equals(loggerConfig.getName())) {
        // TODO Should additivity be inherited?
        loggerConfig = new LoggerConfig(loggerName, level, true);
        config.addLogger(loggerName, loggerConfig);
        loggerConfig.setLevel(level);
        set = true;
    } else {
        set = setLevel(loggerConfig, level);
    }
    return set;
} {code}
In my applicationI have the following loggers structure:

 

*com.myapp.service* -> set on TRACE from XML config

Then I have the class: com.myapp.service.common.ServiceUtils with a logger defined for it like this: {{Logger log = LogManager.getLogger(this.getClass());}}

And in this class, a bunch of log statements on *TRACE*

Then I am trying to set the log level to *INFO* for the whole com.myapp.service.common package. To suppress the *TRACE* logs for example.

If I do this , Configurator will do the following:
 # will try to fetch a LoggerConfig for the *common* package
 # because there is nothing defined for that package only for the parent ... it will return the config for that package
 # because the names differ it will create a new LogConfig with the new logger name and level but {color:#FF0000}without any appenders or appenders refs{color}
 # then it will add this to the config and reload loggers

At this moment the logs from the end class are not printed anymore.

Now , I again set the level for com.myapp.service.common logger , but this time to {*}TRACE{*}. In order to re-enable the logs.

Still , I can't see anything in the logs.

After investigating it seems that adding the LoggerConfig without the appenders copied from parent , is causing this behaviour.

If for example I change the setLevel method to also add the appender refs and appenders when creating the LoggerConfig object , everything is good and logging works as expected.

 Thank you



--
This message was sent by Atlassian Jira
(v8.20.1#820001)