官方文档 http://logging.apache.org/log4j/2.x/manual/customconfig.html#Programatically_Adding_to_the_Current_Configuration显示一个示例:以编程方式添加到当前配置
final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
final Configuration config = ctx.getConfiguration();
Layout layout = PatternLayout.createLayout(PatternLayout.SIMPLE_CONVERSION_PATTERN, config, null, null,null, null);
Appender appender = FileAppender.createAppender("target/test.log", "false", "false", "File", "true", "false", "false", "4000", layout, null, "false", null, config);
appender.start();
config.addAppender(appender);
AppenderRef ref = AppenderRef.createAppenderRef("File", null, null);
AppenderRef[] refs = new AppenderRef[] {ref};
LoggerConfig loggerConfig = LoggerConfig.createLogger("false", "info", "org.apache.logging.log4j", "true", refs, null, config, null );
loggerConfig.addAppender(appender, null, null);
config.addLogger("org.apache.logging.log4j", loggerConfig);
ctx.updateLoggers();
由于这些限制:
- 如果配置文件发生更改,配置将重新加载,并且手动更改将丢失。
- 修改运行配置需要同步所有被调用的方法(addAppender 和 addLogger)。
该解决方案避免使用核心实现中的方法org.apache.logging.log4j.core.Logger
,并且它避免了这样的脏转换:
import org.apache.logging.log4j.Logger;
Logger logger = (Logger) LogManager.getLogger(this.getClass());
((org.apache.logging.log4j.core.Logger) logger).addAppender(...); // Bypassing the public API