Установка шаблона добавления корневого регистратора с помощью log4j programmatic API

#java #logging #log4j2

#java #ведение журнала #log4j2

Вопрос:

Я пытаюсь настроить шаблон корневого регистратора, используя один из программных API log4j. Это то, что у меня есть, оно удаляет регистратор по умолчанию, и я это знаю 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

Комментарии:

1. Похоже, вы удаляете элемент из массива во время итерации по этому массиву. Может быть, в этом причина?

Ответ №1:

Обновить

Казалось бы, единственным способом программной настройки log4j2 было бы создание новой конфигурации с помощью Configuration builder. Таким образом, он остановит конфигурацию по умолчанию и инициализирует новую конфигурацию.

 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());
 

Оригинал

Возможно, вы имеете в виду установить уровень и корневой уровень после перенастройки регистратора. Способ, который у вас есть, применяется к существующему регистратору.

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

Комментарии:

1. можете ли вы объяснить, почему это будет иметь значение? Я полагаю, что я уже пробовал это, но попробую еще раз.

2. да, попробовал еще раз, нет, вы можете увидеть источник в комментарии в другом ответе

3. да, я пробовал этот api, но я тоже не смог заставить его работать. Но это работает.