log4j-1.2迁移至log4j-2时ConsoleAppender.setWriter的等效用法是什么
Log4j 1.x 动态添加控制台Appender的Log4j 2.x等效实现
Log4j 2.x 拆分了API层和核心实现层,不再直接提供Logger类的addAppender方法,动态修改配置需要通过核心层的LoggerContext和Configuration对象完成,等效代码如下:
所需导入
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.core.LoggerContext; import org.apache.logging.log4j.core.appender.ConsoleAppender; import org.apache.logging.log4j.core.config.Configuration; import org.apache.logging.log4j.core.layout.PatternLayout; import java.nio.charset.StandardCharsets;
功能实现代码
// 对应原代码的Logger.getLogger(x.class) public static final Logger s_logger = LogManager.getLogger(x.class); // 获取日志上下文和配置对象,传入false表示使用当前线程的上下文 LoggerContext context = (LoggerContext) LogManager.getContext(false); Configuration config = context.getConfiguration(); // 构造PatternLayout,和原配置格式、编码完全对齐 PatternLayout layout = PatternLayout.newBuilder() .withPattern("%-5p [%t]: %m%n") .withCharset(StandardCharsets.UTF_8) .build(); // 构造ConsoleAppender,默认输出目标为System.out,无需额外设置Writer ConsoleAppender ca = ConsoleAppender.newBuilder() .setName("customConsoleAppender") .setLayout(layout) .build(); // 启动Appender并注册到配置中 ca.start(); config.addAppender(ca); // 将Appender绑定到目标Logger config.getLoggerConfig(s_logger.getName()).addAppender(ca, null, null); // 应用更新后的配置 context.updateLoggers(config);
注意事项
- 上述代码依赖Log4j 2.x的核心实现包
log4j-core,仅依赖API门面包无法实现动态修改配置的操作 - 强转
LoggerContext为核心实现类的操作,仅在项目直接使用Log4j 2.x作为日志实现时生效,若上层使用SLF4J等门面需要先获取Log4j 2.x的原生上下文 - 生产环境优先使用xml/yml/properties等静态配置文件配置Appender,动态添加仅适用于测试、特殊定制等场景
内容的提问来源于stack exchange,提问作者Akshaya Venkatesan
相关产品推荐
相关产品推荐

