【问题标题】:How to configure WriterAppender in log4j2 xml?如何在 log4j2 xml 中配置 WriterAppender?
【发布时间】:2018-01-28 01:03:19
【问题描述】:

我正在尝试将StringWriter 用作Target 用于WriterAppender。有一次,我 将我的日志写入StringWriter,我想将这些日志发送为 我的方法的回应。

我当前的 log4j2.xml -

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="TRACE">
    <Appenders>
        <Writer name="MyAppender" target="StringWriter">
            <JsonLayout/>
        </Writer>
    </Appenders>
    <Loggers>
        <Root level="trace">
            <AppenderRef ref="MyAppender"/>
        </Root>
    </Loggers>
</Configuration>

这给了我以下错误-

2017-08-19 20:07:49,359 main ERROR Writer contains invalid attributes "name", "target"
2017-08-19 20:07:49,359 main ERROR appender Writer has no parameter that matches element JsonLayout
2017-08-19 20:07:49,359 main ERROR Unable to inject fields into builder class for plugin type class org.apache.logging.log4j.core.appender.WriterAppender, element Writer. java.lang.NullPointerException
    at org.apache.logging.log4j.core.appender.WriterAppender.getManager(WriterAppender.java:168)
    at org.apache.logging.log4j.core.appender.WriterAppender.access$000(WriterAppender.java:35)
    at org.apache.logging.log4j.core.appender.WriterAppender$Builder.build(WriterAppender.java:56)

我正在寻找正确的 XML 配置(首选) 如果WriterAppender 无法使用 XML,则进行编程配置。

【问题讨论】:

  • 我尝试使用文档中为 ConsoleAppender 提供的配置,但由于目标类型不同,无法这样配置。

标签: java java-8 log4j log4j2 appender


【解决方案1】:

我认为log4j2 中的 WriterAppender 不支持 XML 配置。

我可以使用下面的示例代码对其进行编程配置 -

package example;

import java.io.StringWriter;

import org.apache.logging.log4j.Level;
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.WriterAppender;
import org.apache.logging.log4j.core.config.AppenderRef;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.LoggerConfig;
import org.apache.logging.log4j.core.layout.PatternLayout;

public class App {

    private static final Logger LOGGER = LogManager.getLogger(App.class);

    private static StringWriter stringWriter = new StringWriter();

    public static void main(String[] args) {
        createLogger();
        int i = 1;
        LOGGER.info("It is info log -  {}", i++);
        LOGGER.warn("It is warn log - {} ", i);
        LOGGER.error("It is error log");

        System.out.println(stringWriter.toString());

    }

    private static void createLogger() {

        final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
        final Configuration config = ctx.getConfiguration();

        PatternLayout layout = PatternLayout.newBuilder()
                .withPattern("%d{yyyy-MM-dd HH:mm:ss.SSS} %level [%t] [%c] [%M] [%l] - %msg%n").build();

        WriterAppender writerAppender = WriterAppender.newBuilder().setName("writeLogger").setTarget(stringWriter)
                .setLayout(layout).build();
        writerAppender.start();
        config.addAppender(writerAppender);

        AppenderRef ref = AppenderRef.createAppenderRef("writeLogger", null, null);
        AppenderRef[] refs = new AppenderRef[] { ref };

        LoggerConfig loggerConfig = LoggerConfig.createLogger(false, Level.INFO, "example", null, refs, null, config,
                null);

        loggerConfig.addAppender(writerAppender, null, null);
        config.addLogger("example", loggerConfig);
        ctx.updateLoggers();
    }
}

您需要在classpath 上有log4j2 配置文件以避免出现以下错误消息 -

ERROR StatusLogger No log4j2 configuration file found. Using default
 configuration: logging only errors to the console. Set system property
 'org.apache.logging.log4j.simplelog.StatusLogger.level' to TRACE to
 show Log4j2 internal initialization logging.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-27
    • 1970-01-01
    • 1970-01-01
    • 2021-08-02
    • 1970-01-01
    • 2019-11-19
    相关资源
    最近更新 更多