【问题标题】:collecting logs with log4j2 v2.9使用 log4j2 v2.9 收集日志
【发布时间】:2017-10-20 17:13:17
【问题描述】:

我有一个关于 2.9 版 log4j2 的问题。 基本上我想和这里描述的一样(log4j),只有2.9: Sample 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");
}

一旦在表单中设置了结尾,集合中应该包含以下日志:

  • 开始
  • meth2:添加集合
  • meth3:添加集合
  • 停止

感谢您的帮助

【问题讨论】:

标签: java logging log4j2


【解决方案1】:

过了一会儿,我想出了以下使用 Log4J 2.8 对我有用的解决方案。我在代码中添加了一些 cmets 来解释必要的不同步骤。

使用相同的名称请求记录器很重要(标有/* 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());
    }
}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-26
      • 2019-05-12
      • 1970-01-01
      • 2021-07-31
      • 1970-01-01
      • 2019-02-28
      • 2016-01-26
      • 2013-11-20
      相关资源
      最近更新 更多