从日志中获取异常

Get exceptions from log

我测试的 Java 应用程序中有很多故障安全进程。这意味着,所有异常都被捕获并记录下来。 我想检查一下,在测试过程中发生了多少异常,是什么类型的异常运行。 我该怎么做?

我们正在使用 Logback 进行记录。

我的第一个想法是将日志写入一个文件,并在测试中解析它,但它不是很好和快速的解决方案。有更好的主意吗?

您可以使用 TurboFilter 对日志记录进行任何操作。请在下面找到示例实现(PS:只是为了解释我编写的直接代码的实现):-

一旦 TurboFilter 将消息记录为 logger.info("printExpStats");,它就会打印统计信息。

logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <turboFilter class="demo.SampleFilter">
        <Marker>printExpStats</Marker>
    </turboFilter>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
            </pattern>
        </encoder>
    </appender>
    <root level="TRACE">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

自定义 TurboFilter class 实现:-

package demo;

import java.util.ArrayList;
import java.util.List;

import org.slf4j.Marker;
import org.slf4j.MarkerFactory;

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.turbo.TurboFilter;
import ch.qos.logback.core.spi.FilterReply;

public class SampleFilter extends TurboFilter {

    String marker;
    Marker markerToAccept;

    List<String> traceExp = new ArrayList<String>();
    List<String> debugExp = new ArrayList<String>();
    List<String> infoExp = new ArrayList<String>();
    List<String> warnExp = new ArrayList<String>();
    List<String> errorExp = new ArrayList<String>();

    @Override
    public FilterReply decide(Marker marker, Logger logger, Level level,
            String format, Object[] params, Throwable t) {
        if (!isStarted()) {
            return FilterReply.NEUTRAL;
        }
        if(level.equals(Level.TRACE)){
            traceExp.add(format.substring(0, 10));
        }
        if(level.equals(Level.DEBUG)){
            debugExp.add(format.substring(0, 10));
        }
        if(level.equals(Level.INFO)){
            infoExp.add(format.substring(0, 10));
        }
        if(level.equals(Level.WARN)){
            warnExp.add(format.substring(0, 10));
        }
        if(level.equals(Level.ERROR)){
            errorExp.add(format.substring(0, 10));
        }
        if ((markerToAccept.toString().equals(format))) {
            System.out.println("TRACE Exp cnt : "+traceExp.size());
            System.out.println("DEBUG Exp cnt : "+debugExp.size());
            System.out.println("INFO Exp cnt : "+infoExp.size());
            System.out.println("WARN Exp cnt : "+warnExp.size());
            System.out.println("ERROR Exp cnt : "+errorExp.size());
        }
        return FilterReply.NEUTRAL;
    }

    public String getMarker() {
        return marker;
    }

    public void setMarker(String markerStr) {
        this.marker = markerStr;
    }

    @Override
    public void start() {
        if (marker != null && marker.trim().length() > 0) {
            markerToAccept = MarkerFactory.getMarker(marker);
            super.start();
        }
    }

}