如何用编程方式(代码)配置 Log4j 的 Logger?
Log4j 编程式配置:Log4j 1.x 用 BasicConfigurator/DOMConfigurator 或直接操作 Logger 层级;Log4j 2 用 ConfigurationBuilderFactory 构建配置。本文给出两代 API 的代码示例。
Log4j 2 的编程式配置用 ConfigurationBuilderFactory 构建 Configuration 对象并启动 LoggerContext;老的 Log4j 1.x 则直接 Logger.getRootLogger().addAppender(...)。现代项目建议仍以配置文件为主、编程配置用于测试与动态场景。
Log4j 2 方式
ConfigurationBuilder<BuiltConfiguration> builder =
ConfigurationBuilderFactory.newConfigurationBuilder();
builder.setStatusLevel(Level.ERROR);
builder.add(builder.newAppender("Stdout", "Console")
.add(builder.newLayout("PatternLayout")
.addAttribute("pattern", "%d %-5p [%t] %m%n")));
builder.add(builder.newRootLogger(Level.INFO).add(builder.newAppenderRef("Stdout")));
Configurator.initialize(builder.build());
Logger log = LogManager.getLogger(MyClass.class);
log.info("编程式配置生效");
Log4j 1.x(遗留系统)
BasicConfigurator.configure(); // 最简:控制台输出
// 或细粒度:
Logger root = Logger.getRootLogger();
root.setLevel(Level.INFO);
root.addAppender(new FileAppender(new PatternLayout("%d %-5p %m%n"), "app.log"));
常见问题(FAQ)
Q:编程配置和 log4j2.xml 谁优先? 后初始化的生效;编程初始化(Configurator.initialize)会覆盖默认加载。
Q:单元测试里怎么静默日志? 编程方式把 root level 设为 OFF,测试后恢复。