log4j2按代码添加logger + appender

时间:2014-07-21 12:00:54

标签: java logging log4j2

我试图通过代码添加一个应该记录某个包的自定义appender。 一切都可以使用这段代码:

String loggerName = "org.test";
final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
Configuration cfg = ctx.getConfiguration();
if (cfg instanceof XmlConfiguration) {
       //add appender if not added
       Appender appender = cfg.getAppender(MyAppender.NAME);
if (appender == null) {
            Appender appender = MyAppender.createAppender(MyAppender.NAME, "%highlight{%d [%t] %-5level: %msg%n%throwable}", "false", null);
            appender.start();
            cfg.addAppender(appender); 
}
LoggerConfig logger = ((XmlConfiguration) cfg).getLogger(loggerName);
            if (logger == null) {
                logger = new LoggerConfig(loggerName, Level.DEBUG, true);
                cfg.addLogger(loggerName, logger);
            }
           logger.addAppender(appender, Level.DEBUG, null);
} //closing the instanceof XMLConfiguration part

所以简而言之......正如你所看到的,如果之前没有定义的appender,我正在创建一个appender。 然后我为org.test创建一个记录器,如果没有添加并将appender添加到此记录器中。

一切都很好,除了一件事: 新的appender和logger正常工作。 但是我在我的XML配置控制台Appender中有其他appender等等。由于某种原因,它们也被添加为org.test记录器的DEBUG级别...即使这个记录器没有像我的情况那样配置任何其他appender ..我正在调试..它只有一个appender,在配置对象..但是记录器仍然发送调试消息到我有的所有附加...(我猜我所有的ROOT级别设置为INFO )... ...从现在开始也显示来自org.test的DEBUG消息......我如何删除这个追加并只使用这个.. :(

感谢。

1 个答案:

答案 0 :(得分:1)

这种情况正在发生,因为默认情况下记录器的 additivity 属性为 true 。当此属性 true 时,日志消息将传播到父记录器,在您的情况下,我认为是ROOT。将记录器中的 additivity 属性设置为 false ,您将获得所需的输出。 更多细节http://logging.apache.org/log4j/2.x/manual/configuration.html#Additivity