输出日志文件的异常及其出现次数

需求:输出日志文件的异常及其出现次数

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值