需求:输出日志文件的异常及其出现次数
1) 忽略只有一行的报错
2) 同样的报错合并,次数+1
显示效果:
完整代码,复制粘贴到你的程序中就可以直接使用,链接:https://download.csdn.net/download/qq_36688143/10827827
思路:
1)对日志内容转码
bufferedReader = new BufferedReader(new InputStreamReader(
new FileInputStream(file),"UTF-8"));
使用流一行行的读取日志内容
bufferedReader.readLine();
2)用一个StringBuffer变量来存储读取的日志信息
StringBuffer sb = new StringBuffer();
当存储的内容达到第三步里的格式时,开始正则表达式校验,校验后进行清空。清空方式为最具效率的
sb.setLength(0);
3)通过正则表达式校验出每两行带时间格式的日志及其中间的内容,这时候得到的日志信息有以下三种格式
1、当两行带时间格式的日志的中间没有其他日志信息时,日志格式如下。这种类型的日志信息属于(需求一:只有一行的报错或者是没有报错),所以不做任何操作,直接忽略。
18-11-08 00:14:04,655 ERROR lilith.aaa.net.aaaService - SocketSession产生异常
18-11-08 22:18:22,062 INFO lilith.aaa.tank.action.- 0
2、当两行带时间格式的日志的中间有一行报错信息时,日志格式如下。这种类型的日志信息也属于需求一,所以直接忽略。
18-11-08 00:14:04,655 ERROR aaa.server.aaaService - SocketSession 产生异常。
java.io.IOException: 连接超时
18-11-08 22:18:10,468 INFO aaa.server.net.aaaService - SocketSession closed!
3、当两行带时间格式的日志的中间有多行报错信息时,日志格式如下。这种类型的日志信息完全符合需求,所以进行下一步操作。
18-11-08 00:14:04,655 ERROR aaa.aaa.aaa.aaa- SocketSession 产生异常。
java.io.IOException: 连接超时
at sun.nio.ch.aaaImpl.read0(Native Method)
at sun.nio.ch.aaaImpl.read0(Native Method)
at sun.nio.ch.aaaImpl.read0(Native Method)
18-11-08 22:18:10,468 INFO aaa.aaa.aaa.aaa- SocketSession closed!
4)判断日志格式是否符合要求,其实只是判断了两行带时间格式的日志的中间的内容而已
start = mapResult.indexOf("\n")+1;
end = mapResult.indexOf("\n",start);
exceptionName = mapResult.substring(start, end);
//判断是否为多行的异常信息
if (exceptionName.length() > 0) {
// 保存符合需求的日志信息
}
5)保存符合需求的日志信息,利用map的键值对特性
//Map存储报错信息,Key为异常名,value为报错信息
Map<String, String> resultMap = new HashMap<String, String>();
//用于存储异常类名,Key为异常名,value为出现次数
Map<String,Integer> exceptionMap = new HashMap<String,Integer>();
这里使用了containsKey方法,判断key是否完全一样,如果一样,那相似的报错信息+1。不一样,就直接保存为新的键值对
if(!exceptionMap.containsKey(exceptionName)) {
exceptionMap.put(exceptionName,1);
resultMap.put(exceptionName,mapResult);
} else {
exceptionMap.put(exceptionName, exceptionMap.get(exceptionName)+1);
resultMap.put(exceptionName,mapResult);
}
6)关闭流
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
7)遍历存储到map的日志报错信息
//输出resultMap
Iterator<Map.Entry<String, String>> it = resultMap.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, String> entry = it.next();
System.out.println(exceptionMap.get(entry.getKey())+ "次相似报错,报错信息:");
System.out.print(entry.getValue());
}
完整代码,复制粘贴到你的程序中就可以直接使用,链接:https://download.csdn.net/download/qq_36688143/10827827