首页 > 解决方案 > log4j-2 中的 ConsoleAppender.setWriter 等价物是什么

问题描述

我正在尝试从 log4j-1.2 迁移到 log4j-2

log4j-2 中以下几行的等价物是什么?

import org.apache.log4j.ConsoleAppender;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;

public static final Logger s_logger = Logger.getLogger(x.class);
ConsoleAppender ca = new ConsoleAppender();
ca.setWriter(new OutputStreamWriter(System.out, "UTF-8"));
ca.setLayout(new PatternLayout("%-5p [%t]: %m%n"));
s_logger.addAppender(ca);

我无法在 Apache 文档中找到答案。

标签: logginglog4jlog4j2

解决方案


在 Log4j2 中,您的代码有两个主要变化:

  • Log4j2 分为 API 和实现,因此 anorg.apache.logging.log4j.Logger不一定是org.apache.logging.log4j.core.Logger,
  • 组件是使用构建器模式创建的,没有设置器。

您的代码最接近的等效项使用WriterAppender

Logger logger = LogManager.getLogger();
if (logger instanceof org.apache.logging.log4j.core.Logger) {
    StringLayout layout = PatternLayout.newBuilder().withPattern("%-5p [%t]: %m%n").build();
    OutputStreamWriter writer = new OutputStreamWriter(System.out, StandardCharsets.UTF_8);
    Appender appender = WriterAppender.newBuilder().setTarget(writer).setLayout(layout).build();
    ((org.apache.logging.log4j.core.Logger) logger).addAppender(appender);
}

ConsoleAppender仅限于使用或System.out使用System.err默认系统编码:

Logger logger = LogManager.getLogger();
if (logger instanceof org.apache.logging.log4j.core.Logger) {
    StringLayout layout = PatternLayout.newBuilder().withPattern("%-5p [%t]: %m%n").build();
    Appender appender = ConsoleAppender.newBuilder().setTarget(Target.SYSTEM_OUT).setLayout(layout).build();
    ((org.apache.logging.log4j.core.Logger) logger).addAppender(appender);
}

上面的代码示例使用这些导入:

import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.Appender;
import org.apache.logging.log4j.core.StringLayout;
import org.apache.logging.log4j.core.appender.ConsoleAppender;
import org.apache.logging.log4j.core.appender.ConsoleAppender.Target;
import org.apache.logging.log4j.core.appender.WriterAppender;
import org.apache.logging.log4j.core.layout.PatternLayout;

推荐阅读