我测试的Java应用程序中有很多故障安全进程。这意味着,捕获并记录所有异常。 我想检查一下,测试运行期间发生了多少次异常。 我该怎么办?
我们正在使用Logback进行记录。
我的第一个想法是将日志写入文件,并在测试中解析它,但它不是那么好用且快速的解决方案。还有更好的主意吗?
答案 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();
}
}
}