简体   繁体   中英

How to configure WriterAppender in log4j2 xml?

I am trying to use StringWriter as Target for WriterAppender . Once I have my logs written to StringWriter , I want to send these logs as response of my method.

My current 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.

I think WriterAppender present in log4j2 does not support XML configuration.

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 -

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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