#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, там такая же удача. Как я могу исправить свой код?
Вот полная ссылка на мой источник, извините, я работал над этим, поэтому номер строки может измениться.
Комментарии:
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, но я тоже не смог заставить его работать. Но это работает.