登录 注册

【JAVA】日志分析统计代码

对网站请求监控日志的统计分析代码
时间:2016-05-06 15:08:21 作者:Mr.d

这一阵针对Request的生命周期做了一个简单监控,通过对每一个请求过程中路由、前置拦截、执行、后置拦截做一个简单的埋点统计,记录其执行时间,并在生命周期结束之前将日志输出出来,达到一个简单的监控的目的。


分析过程

1、读取日志文件(输出格式为json)

2、根据url进行分组

3、对单个URL进行分析,计算平均时间(路由、前置、执行、后置、总时间)

4、根据平均总时间排序输出(从大到小前20)

5、根据请求总次数输出(从多到少前20)

日志结构

{"brithTime":1462243219853,"executeTime":62,"lastTime":1462243219916,"method":"POST","postInterceptor":{},"preInterceptor":{"拦截器类名":0},"request":"请求URL","routeTime":1,"totalTime":63}


public class TestPerformanceAnalysis {

	public static void main(String[] args) {
		
		String path = "/Users/duqingxiang/Documents/things/lvzheng_pc.monitor.log.2016-05-05";
		ayalysis(path);
		
		
	}
	
	public static void ayalysis(String path){
		System.out.println("分析开始!");
		//读取文件
		List<JSONObject> list = FileUtils.readFile(path);
		if (list == null || list.size() <= 0) {
			System.out.println("分析结束!   ----->文件为空");
		}
		
		System.out.println("url分组开始.");
		//根据request url 分组
		Map<String,List<JSONObject>> urlMap = new HashMap<String,List<JSONObject>>();
		for (JSONObject row : list) {
			if (row == null)
				continue;
			String requestUrl = row.getString("request");
			if (requestUrl == null || requestUrl.trim().length() <= 0)
				continue;
			List<JSONObject> rowList = urlMap.get(requestUrl);
			if (rowList == null) {
				rowList = new ArrayList<JSONObject>();
			}
			rowList.add(row);
			urlMap.put(requestUrl, rowList);
		}
		System.out.println("url分组结束.---->共分组:"+urlMap.size());
		
		List<Lifecycle> avgList = new ArrayList<Lifecycle>();
		for (String url : urlMap.keySet()) {
			Lifecycle cycle = getUrlAnaysis(urlMap.get(url));
			if (cycle == null)
				continue;
			avgList.add(cycle);
		}
		
		System.out.println("--------------平均总时间排名前二十----------------");
		sortListByTotalTime(avgList);
		for (int i=0;i<20;i++) {
			Lifecycle c = avgList.get(i);
			System.out.println(c.getUrl()+"--->请求类型:"+c.getMethod()+"--->请求次数:"+c.getDataList().size()
			+"--->avgTotal:"+c.getTotalTime()+"--->avgRoute:"+c.getRouteTime()+"--->avgPre:"+c.getPreTime()+"--->avgExecute:"+c.getExecuteTime()+"--->avgPost:"+c.getPostTime());
		}
		
		
		System.out.println("--------------总访问量排名前二十----------------");
		sortListByCount(avgList);
		for (int i=0;i<20;i++) {
			Lifecycle c = avgList.get(i);
			System.out.println(c.getUrl()+"--->请求类型:"+c.getMethod()+"--->请求次数:"+c.getDataList().size()
			+"--->avgTotal:"+c.getTotalTime()+"--->avgRoute:"+c.getRouteTime()+"--->avgPre:"+c.getPreTime()+"--->avgExecute:"+c.getExecuteTime()+"--->avgPost:"+c.getPostTime());
		}
		
	}
	
	public static List<Lifecycle> sortListByCount(List<Lifecycle> list) {
		
		Collections.sort(list, new Comparator<Lifecycle>() {

			@Override
			public int compare(Lifecycle o1, Lifecycle o2) {
				if (o1.getDataList().size() >= o2.getDataList().size())
					return -1;
				else 
					return 1;
			}
		});
		
		return list;
	}
	
	
	public static List<Lifecycle> sortListByTotalTime(List<Lifecycle> list) {
		
		Collections.sort(list, new Comparator<Lifecycle>() {

			@Override
			public int compare(Lifecycle o1, Lifecycle o2) {
				if (o1.getTotalTime() >= o2.getTotalTime())
					return -1;
				else 
					return 1;
			}
		});
		
		return list;
	}
	
	public static Lifecycle getUrlAnaysis(List<JSONObject> list) {
		
		if (list == null || list.size() <= 0)
			return null;
		
		
		String url = list.get(0).getString("request");
		String method = list.get(0).getString("method");
		long totalTime = 0;
		long routeTime = 0;
		long preTime = 0;
		long executeTime = 0;
		long postTime = 0;
		int index = 1;
		for (JSONObject row : list) {
			if (row == null) 
				continue;
			
			totalTime += row.getLongValue("totalTime");
			routeTime += row.getLongValue("routeTime");
			executeTime += row.getLongValue("executeTime");
			preTime += getInterceptorTime(row,"preInterceptor");
			postTime += getInterceptorTime(row,"postInterceptor");
			index++;
		}
		
		double avgTotal = totalTime/index;
		//平均时长低于2毫秒,认为是跳转请求,忽略
		if (avgTotal <=2)
			return null;
		
		Lifecycle cycle = new Lifecycle();
		cycle.setDataList(list);
		cycle.setRouteTime(routeTime/index);
		cycle.setPreTime(preTime/index);
		cycle.setExecuteTime(executeTime/index);
		cycle.setPostTime(postTime/index);
		cycle.setTotalTime(totalTime/index);
		cycle.setUrl(url);
		cycle.setMethod(method);
		return cycle;
	}
	
	public static long getInterceptorTime(JSONObject json ,String key) {
		long time = 0;
		try {
			JSONObject data = json.getJSONObject(key);
			for (Object obj : data.values()) {
				time += (int)obj;
			}
		} catch (Exception e) {
			// TODO: handle exception
			time =0;
		}
		
		return time;
	}
	
}


评论


点一下   2016-07-08 11:15:16      Mr.d