简体   繁体   English

如何在log4j2 xml中配置WriterAppender?

[英]How to configure WriterAppender in log4j2 xml?

I am trying to use StringWriter as Target for WriterAppender . 我正在尝试将StringWriter用作WriterAppender Target Once I have my logs written to StringWriter , I want to send these logs as response of my method. 将日志写入StringWriter ,我想将这些日志作为方法的响应发送。

My current log4j2.xml - 我当前的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>

This gives me below error - 这给了我下面的错误-

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)

I am looking for correct XML configuration (preferred) If XML is not possible for WriterAppender then programmatic configuration. 我正在寻找正确的XML配置(首选)。如果WriterAppender无法使用XML,则WriterAppender进行程序配置。

I think WriterAppender present in log4j2 does not support XML configuration. 我认为log4j2中存在log4j2不支持XML配置。

I could configure it programmatic using below sample code - 我可以使用下面的示例代码以编程方式配置它-

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();
    }
}

You need to have log4j2 configuration file on classpath for avoiding below error message - 您需要在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.

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM