当前位置: 首页 > 知识库问答 >
问题:

Log4j2-将日志写入写入器

赵渊
2023-03-14

Log4j中有一个WriterAppender,可以将日志写入到Writer

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

共有2个答案

益麻雀
2023-03-14

虽然这是一个老问题,但我想补充一个答案,以供将来参考。

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();
    }
}
濮阳品
2023-03-14

如果没有满足您需求的现有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);
    }
}

您将使用该配置添加WriterAppender,就像添加任何其他appender一样。

 类似资料:
  • 我正在Servlet 3.0和Tomcat中做一个简单的演示项目 我接受邮递员的JSON请求并提供JSON响应。 现在我也想在我的项目中做日志记录。 所以我使用log4j2 罐子使用:- log4j-1.2.12.jar, jackson-databind-2.6.3.jar, jackson-core-2.6.3.jar Servlet代码:- 我的项目目录:- 我的log4j。xml 当我在e

  • 我在Spring Boot应用程序中使用log4j2来简化日志记录。这是我的配置log4j2-dev.xml 我在项目中的基本类 以下是我如何编写日志: 它在正常情况下工作正常。但是,如果我使用Jmetter发送大量请求(总计:7996,平均:98条消息/秒),我会发现日志记录速度太慢,在停止发送请求大约1.5分钟后,日志记录仍在继续,日志文件的容量仍在增加。 我已经搜索了很多,但仍然不知道如何加

  • 问题内容: 我正在尝试使用Go写入日志文件。 我尝试了几种方法,但都失败了。这是我尝试过的: 日志文件被创建,但是没有任何打印或附加到该文件。为什么? 问题答案: 过去的工作方式一定不同,但这对我有用: 基于Go文档,不能用于,因为它会打开文件“供阅读:” 打开命名文件以供读取。如果成功,则可以使用返回文件上的方法进行读取;关联的文件描述符具有mode 。如果有错误,它将是类型。 编辑 检查后移至

  • 我有一个设置,其中docker容器使用日志驱动程序来写入它们的日志。目前日志中的日志行被转发到主机上运行的rsyslog,但syslog行上的应用程序名称显示为。 作为一种解决方法,我想将日志元数据中的字段写入syslog中出现的行中,这样我就可以确定在主机的syslog被发送到syslog聚合服务器之后,哪个容器写入了哪一行。 有什么建议吗?

  • 我正在使用带有log4j2的Spring Boot1.5.9,当我测试日志记录功能时,创建了日志文件,但没有将日志写入其中,而控制台日志记录程序运行良好。请在pom.xml&log4j2.properties配置下面找到。 log4j2.properties文件:

  • 我已经将log4j2.properties文件与springboot应用程序一起使用。正在创建日志文件,但日志未写入该文件。 日志出现在控制台,但没有写入文件,因为我没有得到问题。 奇怪的是,父包记录器“logger Enabled:Enting main\n\n”被写入文件,而另一个父包记录器“****演示应用程序启动*****”没有被写入文件,如上面的代码所示。并且还检查了子包,即记录器,甚至