如何通过编程实现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
相关产品推荐
相关产品推荐

