Log4j2 динамически добавляет новый плагин и приложение в root

У меня есть приложение, которое динамически (через загрузчики классов) загружает другую банку, которая также имеет конфигурацию log4j2.xml. Проблема - jar, который я динамически загружаю, определяет в файле log4j2.xml настраиваемый аппендер, который приложение ДОЛЖНО использовать. Как только мое приложение загружает банку динамически, оно игнорирует log4j2.xml загруженной банки, поэтому мне нужно программно добавить недостающее приложение самостоятельно.

Динамически загружаемый исходный файл jar log4j2.xml:

      <?xml version="1.0" encoding="UTF-8"?>
<Configuration packages="com.mytests.appenders" status="DEBUG">
   <Appenders>
      <Console name="Console" target="SYSTEM_OUT">
        <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
      </Console>
     <MyAppender name="MyAppender" />
  </Appenders>
  <Loggers>
      <Root level="DEBUG">
         <AppenderRef ref="Console"/>
         <AppenderRef ref="MyAppender" />
      </Root>
  </Loggers>

Теперь, поскольку загруженной мной банке нужны данные, хранящиеся в пользовательском MyAppender, мне нужно динамически добавлять приложение (и определение плагина), поскольку использовался мой log4j2.xml, а не загруженные банки.

Что я делаю - что НЕ РАБОТАЕТ - поскольку список rootLoggerConfig appendersRef не обновляется (и ни один метод, который я видел, не заменяет / не обновляет его):

        import org.apache.logging.log4j.Level;
  import org.apache.logging.log4j.LogManager;
  import org.apache.logging.log4j.core.LoggerContext;
  import org.apache.logging.log4j.core.config.AppenderRef;
  import org.apache.logging.log4j.core.config.Configuration;
  import org.apache.logging.log4j.core.config.LoggerConfig;
  import org.apache.logging.log4j.core.config.plugins.util.PluginManager;


  public class LoggingConfig {

   public static void updateLogging() {

    PluginManager.addPackage("com.mytests.appenders"); // Hoped this would add the plugin

    LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
    Configuration config = ctx.getConfiguration();
    MyAppender myAppender = MyAppender.createAppender("MyAppender", null);
    myAppender.start(); 
    config.addAppender(myAppender);  
    ctx.getRootLogger().addAppender(myAppender);

    LoggerConfig rootLoggerConfig = config.getLoggerConfig(""); // ctx.getRootLogger... didn't work so I tried this
    rootLoggerConfig.addAppender(myAppender, Level.ALL, null);

    AppenderRef ref = AppenderRef.createAppenderRef("MyAppender", Level.DEBUG, null);
    AppenderRef[] refs = new AppenderRef[] {ref};
    LoggerConfig loggerConfig = LoggerConfig.createLogger("false", Level.DEBUG, "MyAppender",
            "true", refs, null, config, null );
    loggerConfig.addAppender(myAppender, null, null);
    config.addLogger("MyAppender", loggerConfig);

    ctx.updateLoggers();

}

Что мне не хватает? Я просто хочу добавить новый пользовательский аппендер, который не был определен в моем файле log4j2.xml, и программно добавить его в корневой регистратор, чтобы после добавления каждое сообщение журнала регистрировалось там.

Любая помощь приветствуется, для этого недостаточно примеров.

Примечание. Я посмотрел на:

Не удается добавить приложение log4j2 динамически и как программно добавить приложения Log4J2 во время выполнения?и другие примеры, прежде чем я разместил свой код. В этих случаях приложение уже было определено в файле xml.

0 ответов

Другие вопросы по тегам