set根记录器appender模式与log4j编程api

hmmo2u0o  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(344)

我正在尝试使用log4j编程api之一配置根记录器的模式。这就是我所拥有的,它删除了默认的记录器,我知道 reconfigure , setLevel 以及 setRootLevel 正在工作,但是新的 ConsoleAppender 实际上没有记录任何东西

private static void configureLog4j(Level rootLevel, Map<String, Level> levelMap) {
    var pattern = PatternLayout.newBuilder().withPattern( "%highlight{[%t] %-5level: %msg%n%throwable}\n" ).build();
    var console = ConsoleAppender.createDefaultAppenderForLayout( pattern );
    var config = LoggerContext.getContext().getConfiguration();
    config.addAppender( console );

    var root = config.getRootLogger();
    for ( var appenderRef : root.getAppenderRefs() ) {
      root.removeAppender( appenderRef.getRef() );
    }
    root.addAppender( console, rootLevel, null );
    Configurator.setRootLevel( rootLevel );
    Configurator.setLevel( levelMap );
    Configurator.reconfigure(config);
  }

我也尝试了另一个api,同样的运气。如何修复代码?
这里有一个完整的链接到我的来源,对不起,我一直在工作,所以行号可能会改变。
https://github.com/xenoterracide/brix/blob/master/src/main/java/com/xenoterracide/brix/application.java#l108

u1ehiz5o

u1ehiz5o1#

更新
以编程方式配置log4j2的唯一方法似乎是使用configurationbuilder创建一个新的配置。这样它将停止默认配置并用新配置初始化。

ConfigurationBuilder<BuiltConfiguration> builder = ConfigurationBuilderFactory.newConfigurationBuilder();
AppenderComponentBuilder appenderBuilder = builder.newAppender("console", "CONSOLE").addAttribute("target", ConsoleAppender.Target.SYSTEM_OUT);
appenderBuilder.add(builder.newLayout("PatternLayout").addAttribute("pattern", "%highlight{[%t] %-5level: %msg%n%throwable}\n"));
builder.add(appenderBuilder);
builder.add(builder.newRootLogger(rootLevel).add(builder.newAppenderRef("console")));
levelMap.forEach((s, level) -> builder.add(builder.newLogger(s, level)));
Configurator.initialize(builder.build());

起初的
也许您的意思是在记录器重新配置之后设置level和rootlevel。您使用的方法将应用于现有记录器。

Configurator.reconfigure(config);
Configurator.setRootLevel( rootLevel );
Configurator.setLevel( levelMap );

相关问题