如何在log4j2.02中以编程方式配置记录器?

2022-09-03 18:07:58

我想在没有任何配置文件的情况下使用log4j。我想做的是:

logger = (Logger) LogManager.getLogger(this.getClass());
String pattern = "[%level] %m%n";
//do something to make this logger output to an local file "/xxx/yyy/zzz.log"

我已经找到了这个答案:以编程方式配置Log4j记录器

但是的文档说:此方法通过公共API公开,主要用于单元测试。Logger#addAppender

我不确定在我的代码中使用此方法的正确方法,或者有其他更好的解决方案来解决我的问题。


答案 1

官方文档显示了一个示例:以编程方式添加到当前配置

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();

具有以下限制:

  1. 如果更改了配置文件,则将重新加载配置,并且手动更改将丢失。
  2. 修改正在运行的配置需要同步所有被调用的方法(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 

答案 2

使用最新版本的 ,所有创建 API,如log4j2

PatternLayout.createLayout, 
FileAppender.createAppender, 
LoggerConfig.createLogger 

已被弃用,最好使用自定义日志以及以编程方式定义日志配置。ConfigurationFactoryConfigurationBuilder


推荐