Java Log4j2-将日志写入写入器

Java Log4j2-将日志写入写入器,java,log4j2,writer,appender,Java,Log4j2,Writer,Appender,在Log4j中,出现了一个Writer,可以将日志写入Writer 我需要在Log4j2中使用相同的功能,但我还没有找到这样做的选项。有人知道如何使用Log4j2实现同样的效果吗?如果没有满足您需求的现有appender,请创建一个自定义appender插件 我举了一个简单的例子 package com.logging; import org.apache.logging.log4j.core.Filter; import org.apache.logging.log4j.core.Layou

Log4j
中,出现了一个
Writer
,可以将日志写入
Writer


我需要在
Log4j2
中使用相同的功能,但我还没有找到这样做的选项。有人知道如何使用
Log4j2
实现同样的效果吗?

如果没有满足您需求的现有appender,请创建一个自定义appender插件

我举了一个简单的例子

package com.logging;

import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.appender.AbstractAppender;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
import org.apache.logging.log4j.core.config.plugins.PluginElement;
import org.apache.logging.log4j.core.config.plugins.PluginFactory;
import org.apache.logging.log4j.core.layout.PatternLayout;

import java.io.IOException;
import java.io.PrintWriter;
import java.io.Serializable;
import java.io.Writer;

@Plugin(name = "WriterAppender", category = "Core", elementType = "appender", printObject = false)
public class WriterAppender extends AbstractAppender{

    private Writer writer;

    protected WriterAppender(String name, Filter filter, Layout<? extends Serializable> layout, boolean ignoreExceptions, String argOne, String argTwo) {
        super(name, filter, layout, ignoreExceptions);
        writer = new PrintWriter(System.out);//init or retrieve writer resource upon construction
    }

    @Override
    public void append(LogEvent logEvent) {
        try {
            writer.write(logEvent.getMessage().getFormattedMessage());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @PluginFactory
    public static WriterAppender createAppender(
            @PluginAttribute("name") String name,
            @PluginElement("Layout") Layout<? extends Serializable> layout,
            @PluginElement("Filter") final Filter filter,
            @PluginAttribute("otherAttribute") String otherAttributeOne,
            @PluginAttribute("otherAttributeTwo") String otherAttributeTwo
    ) {
        if (name == null) {
            LOGGER.error("No name provided for MyCustomAppenderImpl");
            return null;
        }
        if (layout == null) {
            layout = PatternLayout.createDefaultLayout();
        }
        return new WriterAppender(name, filter, layout, true, otherAttributeOne,otherAttributeTwo);
    }
}
package.com.logging;
导入org.apache.logging.log4j.core.Filter;
导入org.apache.logging.log4j.core.Layout;
导入org.apache.logging.log4j.core.LogEvent;
导入org.apache.logging.log4j.core.appender.AbstractAppender;
导入org.apache.logging.log4j.core.config.plugins.Plugin;
导入org.apache.logging.log4j.core.config.plugins.PluginAttribute;
导入org.apache.logging.log4j.core.config.plugins.PluginElement;
导入org.apache.logging.log4j.core.config.plugins.PluginFactory;
导入org.apache.logging.log4j.core.layout.PatternLayout;
导入java.io.IOException;
导入java.io.PrintWriter;
导入java.io.Serializable;
导入java.io.Writer;
@插件(name=“WriterAppender”,category=“Core”,elementType=“appender”,printObject=false)
公共类WriterAppender扩展了AbstractAppender{
私人作家;

受保护的WriterAppender(字符串名称、筛选器、布局虽然这是一个老问题,但我想添加答案以供将来参考

log4j2
中存在
WriterAppender
。下面是使用编程配置对其进行配置的一种方法-

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