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

使用log4j2v2收集日志。9

程卓君
2023-03-14

我有一个关于2.9版本的log4j2的问题。基本上,我想做的与这里描述的相同(log4j),只有2.9:示例log4j v1. x

我需要一个可以在类中的任何方法中调用的记录器。这是从某个起点递归地收集所有后续日志。该集合应该能够在以后以任何形式读出。

Logger logger = LogManager.getLogger();
public void meth1(){
  StringWriter/ List/ String or whatever
  logger.add(Collector);
  logger.info("Start");
  this.meth2();
  this.meht3();
  logger.info("Stop");
  => do something with the collected logs
}
public void meht2(){
  logger.info("meth2: add Collection");
}
public void meth3(){
  logger.info("meth3: add Collection");
}
public void meht4(){
  logger.info("foo");
}

在表单中设置结束后,集合中应包括以下日志:

  • 开始

谢谢你的帮助

共有2个答案

隆宏爽
2023-03-14

谢谢,我已经根据自己的需要进行了调整:

public static StringWriter createStringWriter(String classname){
    StringWriter stringWriter = new StringWriter();
    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(classname + "writeLogger")
                                        .setTarget(stringWriter)
                                        .setLayout(layout)
                                        .build();
    writerAppender.start();
    config.addAppender(writerAppender);
    LoggerConfig loggerConfig = config.getLoggerConfig(classname);
    loggerConfig.addAppender(writerAppender, null, null);
    ctx.updateLoggers();
    return stringWriter;
}

public static void removeStringWriter(String classname){
    final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
    final Configuration config = ctx.getConfiguration();
    LoggerConfig loggerConfig = config.getLoggerConfig(classname);
    loggerConfig.removeAppender(classname + "writeLogger");
    ctx.updateLoggers();
}
司空俊悟
2023-03-14

过了一会儿,我想出了下面的解决方案,它适用于我使用log4j2.8。我在代码中添加了一些注释来解释不同的必要步骤。

请求记录器时必须使用与存储配置时相同的名称(标有/*1*/的行)(标有/*2*/的行)。这意味着不能使用类名获取记录器,或者MyClass.class.getName()应在/*2*/处使用。

public class LoggingTest {

    public static void main(String[] args) {

        // define the logger, could also be static in class
        final String loggerName = "myCollectingLogger";
        Logger logger = LogManager.getLogger(loggerName); /* 1 */

        // the log message collector
        StringWriter writer = new StringWriter();

        // start adapting the logger configuration
        LoggerContext ctx = LoggerContext.getContext(false);
        Configuration config = ctx.getConfiguration();

        // create our appender
        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("writerAppender").setTarget(writer).setLayout(layout).build();

        // add the appender to a LoggerConfig
        AppenderRef ref = AppenderRef.createAppenderRef("writerAppender", 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);

        // enable the LoggerConfig in the LoggerContext
        config.addLogger(loggerName, loggerConfig); /* 2 */
        ctx.updateLoggers();

        // use the logger:
        logger.info("Start");
        logger.warn("foo bar");
        logger.error("relax, it's just a test");
        logger.info("Stop");

        System.out.println("--- the collected log messages: ---");
        System.out.println(writer.toString());
    }
}
 类似资料:
  • 系统与程序的运行日志对排查问题以及实现一些自动化操作可能非常有用。本文将简要说明收集 TiDB 及相关组件日志的方法。 TiDB 与 Kubernetes 组件运行日志 通过 TiDB Operator 部署的 TiDB 各组件默认将日志输出在容器的 stdout 和 stderr 中。对于 Kubernetes 而言,这些日志会被存放在宿主机的 /var/log/containers 目录下,并

  • 前言 在进行日志收集的过程中,我们首先想到的是使用Logstash,因为它是ELK stack中的重要成员,但是在测试过程中发现,Logstash是基于JDK的,在没有产生日志的情况单纯启动Logstash就大概要消耗500M内存,在每个Pod中都启动一个日志收集组件的情况下,使用logstash有点浪费系统资源,经人推荐我们选择使用Filebeat替代,经测试单独启动Filebeat容器大约会消

  • 我是Hadoop的新手,正在学习apache Flume。我在Virtualbox上安装了CDH 4.7。以下命令将输出顶部 cputime。如何使用 Apache flume 将以下命令的日志数据输出传输到我的 HDFS?如何创建水槽配置文件?

  • 前面的课程中和大家一起学习了 Kubernetes 集群中监控系统的搭建,除了对集群的监控报警之外,还有一项运维工作是非常重要的,那就是日志的收集。 介绍 应用程序和系统日志可以帮助我们了解集群内部的运行情况,日志对于我们调试问题和监视集群情况也是非常有用的。而且大部分的应用都会有日志记录,对于传统的应用大部分都会写入到本地的日志文件之中。对于容器化应用程序来说则更简单,只需要将日志信息写入到 s

  • 本章展示如何配置Istio来自动收集mesh中服务的遥测数据。 在本章末尾,将为mesh中的服务调用启用新的metric和新的日志流。 BookInfo应用将作为介绍本章内容的示例应用。 开始之前 在集群中安装Istio并部署一个应用程序。 本章假设Mixer使用默认配置(--configDefaultNamespace=istio-system)。 如果使用不同的值,则更新这个任务中的配置和命令

  • 问题内容: 我已配置Java将垃圾回收信息转储到日志中(详细GC)。我不确定日志中的垃圾回收项是什么意思。这些条目的示例发布在下面。我在Google上四处搜寻,但找不到可靠的解释。 我有一些合理的猜测,但我正在寻找答案,这些答案提供了对条目中数字含义的严格定义,并有可靠的依据。引用sun文档的所有答案的自动+1。我的问题是: PSYoungGen指的是什么?我认为这与上一代(年轻人)有关,但是究竟