You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过编程实现Log4j2的Appender与Logger配置并生效?

Log4j2编程配置Appender和Logger问题解决

一、修复第一段无效代码

你的第一段代码存在语法、变量名及逻辑错误,修正后即可正常生成日志:

错误点说明

  • 变量名不一致:定义LoggerContext cx后却用ctx调用方法
  • 语法遗漏:ab.setLayout(layout)末尾缺少分号
  • 方法名拼写错误:config.addAppener(appender)应为config.addAppender(appender)
  • 重复调用build():FileAppender.Builder无需重复执行build,一次即可生成有效实例

修正后的代码

final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
final Configuration config = ctx.getConfiguration();
final Layout<String> layout = PatternLayout.createDefaultLayout(config);

// 构建FileAppender
FileAppender.Builder<?> ab = FileAppender.newBuilder();
ab.withFileName("test.txt");
ab.withAppend(true);
ab.setName("test");
ab.setLayout(layout);
FileAppender appender = ab.build();
appender.start();

// 将Appender添加到配置
config.addAppender(appender);

// 创建AppenderRef
AppenderRef ref = AppenderRef.createAppenderRef("test", null, null);
AppenderRef[] refs = new AppenderRef[]{ref};

// 创建LoggerConfig:additivity设为true,日志级别DEBUG,名称"test"
LoggerConfig lc = LoggerConfig.createLogger(true, Level.DEBUG, "test", "true", refs, null, config, null);
lc.addAppender(appender, null, null);
config.addLogger("test", lc);

// 更新日志上下文
ctx.updateLoggers();

对应正确XML配置

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Appenders>
        <FileAppender name="test" fileName="test.txt" />
    </Appenders>
    <Loggers>
        <Logger name="test" level="debug" additivity="true">
            <AppenderRef ref="test" />
        </Logger>
        <Root level="info" additivity="false">
            <AppenderRef ref="console" />
        </Root>
    </Loggers>
</Configuration>

二、为Root Logger的AppenderRef单独设置日志级别

若要给Root Logger下的不同AppenderRef设置独立级别,需创建带级别参数的AppenderRef,重新构建Root Logger的Appender引用集合:

实现代码

final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
final Configuration config = ctx.getConfiguration();
final Layout<String> layout = PatternLayout.createDefaultLayout(config);

// 构建FileAppender
FileAppender.Builder<?> ab = FileAppender.newBuilder();
ab.withFileName("test.txt");
ab.withAppend(true);
ab.setName("test");
ab.setLayout(layout);
FileAppender appender = ab.build();
appender.start();
config.addAppender(appender);

// 获取Root Logger配置
LoggerConfig rootConfig = config.getRootLogger();

// 保留原有AppenderRef并添加带级别新的AppenderRef
List<AppenderRef> refList = new ArrayList<>();
// 原有console AppenderRef,继承Root级别info
refList.add(AppenderRef.createAppenderRef("console", null, null));
// 新的test AppenderRef,单独设置级别为DEBUG
refList.add(AppenderRef.createAppenderRef("test", Level.DEBUG, null));

// 替换Root Logger的AppenderRef集合
rootConfig.setAppenderRefs(refList.toArray(new AppenderRef[0]));
rootConfig.updateConfiguration(config);

// 更新日志上下文
ctx.updateLoggers();

对应XML配置

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Appenders>
        <FileAppender name="test" fileName="test.txt" />
    </Appenders>
    <Loggers>
        <Root level="info" additivity="false">
            <AppenderRef ref="console" />
            <AppenderRef ref="test" level="debug" />
        </Root>
    </Loggers>
</Configuration>

内容的提问来源于stack exchange,提问作者mantisghost

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 10:30:28