0

我有一个应用程序可以动态地(通过类加载器)加载一个不同的 jar,该 jar 也有一个 log4j2.xml 配置。问题 - 我动态加载的 jar 在 log4j2.xml 文件中定义了应用程序必须使用的自定义附加程序。一旦我的应用程序动态加载 jar,它就会忽略加载的 jar 的 log4j2.xml,因此我需要自己以编程方式添加缺少的 appender。

动态加载的 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>

现在,由于我加载的 jar 需要存储在自定义 MyAppender 中的数据,因此我需要动态添加 appender(和插件定义),因为使用的是我的 log4j2.xml 而不是加载的 jar。

我在做什么——这不起作用——因为 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 文件中定义

4

0 回答 0