Xianyin Xin created LOG4J2-1919:
-----------------------------------

             Summary: Change the appender of a logger will affect other loggers
                 Key: LOG4J2-1919
                 URL: https://issues.apache.org/jira/browse/LOG4J2-1919
             Project: Log4j 2
          Issue Type: Bug
            Reporter: Xianyin Xin


{code}
    String logger1Name = Test.class.getName();
    String logger2Name = "fileLogger";

    Logger logger1 = LogManager.getLogger(logger1Name);
    Logger logger2 = LogManager.getLogger(logger2Name);

    Writer writer = null;
    try {
      writer = new PrintWriter(new FileOutputStream("D:/file.log"));
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    }

    String fileAppender = "myFileAppender";

    LoggerContext loggerContext = (LoggerContext) LogManager.getContext(false);
    Configuration conf = loggerContext.getConfiguration();

    final PatternLayout layout = PatternLayout.createDefaultLayout(conf);
    final Appender appender = WriterAppender
        .createAppender(layout, null, writer, fileAppender, false, true);
    appender.start();

    // CHANGE ONLY the appender for logger2, but logger1 will be affected also:
    Map<String, Appender> appenderMap = conf.getAppenders();
    LoggerConfig config = conf.getLoggerConfig(logger2Name);
    for (Map.Entry<String, Appender> entry : appenderMap.entrySet()) {
      config.removeAppender(entry.getKey());
    }
    config.addAppender(appender, null, null);

    logger1.info("hahaha");
    logger2.info("hehehe");
{code}

The output in "D:file.log" reads,
{quote}
hahaha
hehehe
{quote}
But the stdout appender for logger1 ouputs nothing.

I don't know if it is the design. However, the LoggerConfig returned by 
{{conf.getLoggerConfig(logger_name)}} is in fact the {{PrivateConfig}} of 
logger2, which can be seen from {{Logger.removeAppender()}} and 
{{Logger.addAppender()}}.



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Reply via email to