我有一个应用程序可以动态地(通过类加载器)加载一个不同的 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 文件中定义