从日志中获取异常

时间:2015-09-29 14:50:13

标签: java testing exception-handling logback

我测试的Java应用程序中有很多故障安全进程。这意味着,捕获并记录所有异常。 我想检查一下,测试运行期间发生了多少次异常。 我该怎么办?

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

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

1 个答案:

答案 0 :(得分:0)

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

一旦TurboFilter将logg记录为 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类实现: -

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

}