【从零学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上进行查看总结通过日志收集系统可以对系统进行监控 , 不但有助于排错 , 而且可以看到每个接口的处理时间 , 是我们对系统进行优化一个重要参考指标会持续将生产项目中进行优化同步到本项目中并进行输出
推荐阅读
-
-
破解保险理赔痛点 蜗牛保险行业首创“省心买放心赔”
-
-
扬子晚报|自称压力大女子醉倒家门口,巡逻民警赶来紧急送医
-
百度ERINE▲百度ERINE连拿五项国际冠军 攻克语义难关让AI更懂世界
-
蔡少芬|刘銮雄形容蔡少芬:她是我见过最听话的女孩,命苦摊上个烂赌的妈
-
詹姆斯|浓眉仅9次出手,詹姆斯是不是不给球权,为自己夺得FMVP铺路
-
钱江晚报|浙江街头一辆宝马不停绕圈!撞停后打开车门一看:女司机已一动不动……
-
-
汽车之家▲,拨开云雾,迎来春日,见识美好世界,驾驶长安CS75
-
人字拖@今年这双“人字拖”火了,搭裙子裤子都超有范儿!
-
北京接受无车家庭申请指标这是真的吗?北京接受无车家庭申请指标具体情况
-
柏柏育儿漫画|都让孩子否定自己一次,你的每一次“不可以”
-
【大国飞鹰】俄罗斯派8支医疗队支援意大利,波兰不顾人道挡去路,美国不支援
-
从Spring Cloud到UCloud UK8S的微服务迁移实践
-
-
聚玩社官方:2.5折平史低,售价62元,《少数幸运儿》Steam开启促销
-
:卤料不用多, 记住这四味卤料, 卤肉香气外溢, 做出来的卤肉, 色香味俱全!
-
时尚圈的奇葩大喵|矮胖女孩的秋冬真爱,是被吐槽很久的羽绒?显瘦显高确实有够绝
-
90后小伙骑行中国一年变沧桑大叔|90后小伙骑行中国一年变沧桑大叔 他究竟经历了什么?