【从零学ELK系列目录】从零学ELK系列(一):为什么要跟我学从零学ELK系列
从零学ELK系列(二):VMware安装Centos(超详细图文教程)
从零学ELK系列(三):Centos安装Docker(超详细图文教程)
从零学ELK系列(四)Docker安装Elasticsearch(超详细图文教程)
从零学ELK系列(五):Docker安装kibana(超详细图文教程)
从零学ELK系列(六):Docker安装Logstash(超详细图文教程)
从零学ELK系列(七):Centos安装Filebeat(超详细图文教程)
【从零学ELK系列(十):SpringBoot接入ELK升级版】从零学ELK系列(八):SpringBoot项目接入ELK(超详细图文教程)
从零学ELK系列(九):Nginx接入ELK(超详细图文教程)
从零学ELK系列(十):SpringBoot项目接入ELK升级版(超详细图文教程)
前言之前在《从零学ELK系列(八):SpringBoot项目接入ELK(超详细图文教程)》中演示了SpringBoot项目接入ELK , 后来项目中对这部分进行了优化 , 之前博文中也有读者问到 , 将优化整理成博文和大家共享;
优化前:
一次请求记录两条日志(request一条 , response一条) , 通过UUID传连起来
优化后:
一次请求记录一条日志(request信息与response信息都在一起)
架构图&时序图架构图
主要代码展示FileBeatLogUtil/**Copyright(c)2020.zhanghan_java@163.comAllRightsReserved.*项目名称:SpringBoot项目接入ELK*类名称:FileBeatLogUtil.java*创建人:张晗*联系方式:zhanghan_java@163.com*开源地址:*博客地址:*/packagecom.zhanghan.zhelkboot.util;importcom.alibaba.fastjson.JSON;importcom.zhanghan.zhelkboot.util.wrapper.Wrapper;importorg.aspectj.lang.JoinPoint;importorg.aspectj.lang.reflect.MethodSignature;importorg.slf4j.Logger;importorg.slf4j.MDC;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.text.SimpleDateFormat;importjava.util.*;publicclassFileBeatLogUtil{publicstaticvoidwriteRequestInfo(HttpServletRequestrequest,StringapplicationName,StringreqName,StringrequestParams){StringrequestURI=request.getRequestURI();//获取requestHeaderEnumerationrequestHeaderNames=request.getHeaderNames();MapreuestHeaderMap=newHashMap<>();while(requestHeaderNames.hasMoreElements()){Stringname=requestHeaderNames.nextElement();Stringvalue=https://pcff.toutiao.jxnews.com.cn/p/20200909/request.getHeaders(name).nextElement();reuestHeaderMap.put(name,value);}StringrequestHeader="";if(null!=reuestHeaderMap&&reuestHeaderMap.size()>0){requestHeader=JSON.toJSONString(reuestHeaderMap);}//防止MDC值空指针 , 所有入参不为nullapplicationName=org.springframework.util.StringUtils.isEmpty(applicationName)?"":applicationName;requestURI=org.springframework.util.StringUtils.isEmpty(requestURI)?"":requestURI;reqName=org.springframework.util.StringUtils.isEmpty(reqName)?"":reqName;requestParams="null".equals(requestParams)?"":requestParams;//MDC值为ES键值对JSON信息MDC.put("applicationName",applicationName);MDC.put("requestTime",getStringTodayTime());MDC.put("requestURI",requestURI);MDC.put("requestHeader",requestHeader);MDC.put("sourceName",reqName);MDC.put("requestParams",requestParams);}publicstaticvoidwriteResponseLog(Objecto,Loggerlog,HttpServletResponseresponse){//取responseHeader内容MapresponseHeaderMap=newHashMap<>();CollectionheaderNames=response.getHeaderNames();headerNames.forEach(name->{responseHeaderMap.put(name,response.getHeader(name));});StringstrResponseHeader="";if(null!=responseHeaderMap&&responseHeaderMap.size()>0){strResponseHeader=JSON.toJSONString(responseHeaderMap);}//获取response内容StringresponseCode="";StringresponseMsg="";StringresponseBody="";Wrapperwrapper;if(null!=o){wrapper=(Wrapper)o;if(null!=wrapper){responseCode=String.valueOf(wrapper.getCode());responseMsg=wrapper.getMessage();responseBody=wrapper.getResult().toString();}}//MDC值为ES键值对JSON信息MDC.put("responseHeader",strResponseHeader);MDC.put("responseCode",responseCode);MDC.put("responseMsg",responseMsg);MDC.put("responseBody",responseBody);MDC.put("responseTime",getStringTodayTime());MapcopyOfContextMap=MDC.getCopyOfContextMap();StringreqInfoJsonStr=JSON.toJSONString(copyOfContextMap);log.info(reqInfoJsonStr);}/***获取请求参数 , 处理为json字符串**@paramjoinPoint*@return*/publicstaticStringgetParams(JoinPointjoinPoint){Object[]argValues=joinPoint.getArgs();String[]argNames=((MethodSignature)joinPoint.getSignature()).getParameterNames();LinkedHashMaplinkedHashMap=newLinkedHashMap<>();if(argNames!=null&&argNames.length>0){for(inti=0;i<argNames.length;i++){StringthisArgName=argNames[i];StringthisArgValue=https://pcff.toutiao.jxnews.com.cn/p/20200909/argValues[i].toString();linkedHashMap.put(thisArgName,thisArgValue);}}returnJSON.toJSONString(linkedHashMap);}publicstaticStringgetStringTodayTime(){Datetodat_date=newDate();//将日期格式化SimpleDateFormatsimpleDateFormat=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss.SSS");//转换成字符串格式returnsimpleDateFormat.format(todat_date);}}RequestLogAspectConf/**Copyright(c)2020.zhanghan_java@163.comAllRightsReserved.*项目名称:SpringBoot项目接入ELK*类名称:RequestLogAspectConf.java*创建人:张晗*联系方式:zhanghan_java@163.com*开源地址:*博客地址:*/packagecom.zhanghan.zhelkboot.aop;importcom.zhanghan.zhelkboot.util.FileBeatLogUtil;importorg.aspectj.lang.JoinPoint;importorg.aspectj.lang.annotation.Aspect;importorg.aspectj.lang.annotation.Before;importorg.aspectj.lang.annotation.Pointcut;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.core.annotation.Order;importorg.springframework.core.env.Environment;importorg.springframework.stereotype.Component;importjavax.servlet.http.HttpServletRequest;@Aspect@Order(0)@ComponentpublicclassRequestLogAspectConf{@AutowiredprivateHttpServletRequestrequest;@AutowiredprivateEnvironmentenv;privatefinalLoggerlogger=LoggerFactory.getLogger(this.getClass());/***范围切点方法*/@Pointcut("execution(*com.zhanghan.zhelkboot.controller..*.*(..))")publicvoidmethodPointCut(){}@Before("methodPointCut()")voiddoBefore(JoinPointjoinPoint){authLogic(joinPoint);}privatevoidauthLogic(JoinPointjoinPoint){try{StringapplicationName=env.getProperty("spring.application.name");//获取当前http请求StringreqName=joinPoint.getSignature().getDeclaringTypeName()+"."+joinPoint.getSignature().getName();StringrequestParams=FileBeatLogUtil.getParams(joinPoint);FileBeatLogUtil.writeRequestInfo(request,applicationName,reqName,requestParams);}catch(Exceptione){logger.error("authLogic;Exception:{}",e.getMessage());}}}ResponseLogAdvice/**Copyright(c)2020.zhanghan_java@163.comAllRightsReserved.*项目名称:SpringBoot项目接入ELK*类名称:ResponseLogAdvice.java*创建人:张晗*联系方式:zhanghan_java@163.com*开源地址:*博客地址:*/packagecom.zhanghan.zhelkboot.aop;importcom.zhanghan.zhelkboot.util.FileBeatLogUtil;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.core.MethodParameter;importorg.springframework.http.MediaType;importorg.springframework.http.server.ServerHttpRequest;importorg.springframework.http.server.ServerHttpResponse;importorg.springframework.web.bind.annotation.ControllerAdvice;importorg.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;importjavax.servlet.http.HttpServletResponse;@ControllerAdvicepublicclassResponseLogAdviceimplementsResponseBodyAdvice{@AutowiredprivateHttpServletResponseresponse;privatefinalLoggerlogger=LoggerFactory.getLogger(this.getClass());@Overridepublicbooleansupports(MethodParametermethodParameter,ClassaClass){returntrue;}@OverridepublicObjectbeforeBodyWrite(Objecto,MethodParametermethodParameter,MediaTypemediaType,ClassaClass,ServerHttpRequestserverHttpRequest,ServerHttpResponseserverHttpResponse){try{if(o!=null){Loggerlog=LoggerFactory.getLogger("logstashInfo");FileBeatLogUtil.writeResponseLog(o,log,response);}}catch(Exceptione){logger.error("beforeBodyWrite;Exception:{}",e.getMessage());}returno;}}LombokController/**Copyright(c)2020.zhanghan_java@163.comAllRightsReserved.*项目名称:SpringBoot项目接入ELK*类名称:LombokController.java*创建人:张晗*联系方式:zhanghan_java@163.com*开源地址:*博客地址:*/packagecom.zhanghan.zhelkboot.controller;importcom.zhanghan.zhelkboot.controller.request.LombokRequest;importcom.zhanghan.zhelkboot.util.wrapper.WrapMapper;importcom.zhanghan.zhelkboot.util.wrapper.Wrapper;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.web.bind.annotation.RequestBody;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestMethod;importorg.springframework.web.bind.annotation.RestController;importjava.util.HashMap;importjava.util.Map;@RestControllerpublicclassLombokController{privatestaticLoggerlogger=LoggerFactory.getLogger(LombokController.class);@RequestMapping(value="https://pcff.toutiao.jxnews.com.cn/lombok",method=RequestMethod.POST)publicWrapperlombok(@RequestBodyLombokRequestlombokRequest){logger.info("lombokparam{}",lombokRequest.toString());Mapmap=newHashMap();map.put("intLombok",lombokRequest.getIntLombok());map.put("strLombok",lombokRequest.getStrLombok());map.put("boleanLombok",lombokRequest.getBoleanLombok());map.put("personLombok",lombokRequest.getPersonLombok());returnWrapMapper.ok(map);}}测试在服务器上部署并进行请求在Kibina上进行查看总结通过日志收集系统可以对系统进行监控 , 不但有助于排错 , 而且可以看到每个接口的处理时间 , 是我们对系统进行优化一个重要参考指标会持续将生产项目中进行优化同步到本项目中并进行输出
推荐阅读
-
中新经纬|33城预警!京津冀等地14-17日将再现污染过程
-
-
丹东云播|丹东姑娘发现“男友”竟是女儿身~~被骗感情被骗钱……,天呐
-
每日小情书▲早上狗都躲着我!,十条段子:喝多了和狗谈心一晚上
-
-
新资讯|现在都流行“蜜桃臀”?热巴和杨幂同穿修身裙,身姿曲线你选哪个
-
周冬雨|28岁9次拿影后,周冬雨成功的背后,到底经历了什么?
-
-
【北京日报客户端】巩立姣:目标直指东京奥运会金牌,强化体能短板、冬训成果明显
-
-
3岁男孩肺癌晚期,劝告家长:戒烟吧!别把孩子送入“鬼门关”
-
-
-
-
-
海贼资讯|实况球会经理评测:禁区之狐偷猎者,少林足球诚不欺我
-
桑塔纳|不到10万买大众桑塔纳 畅销多年魅力不减 现在入手一点都不晚
-
师祖学|幽默笑话:传说,孙悟空找菩提师祖学本事······
-
-
木瓜健康|宝宝宝妈一夜安眠,家有“睡渣”宝宝?儿科医生:掌握这5个规律