从日志中获取异常
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();
}
}
}
我测试的 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();
}
}
}