安庆大理运城常德铜陵江西
投稿投诉
江西南阳
嘉兴昆明
铜陵滨州
广东西昌
常德梅州
兰州阳江
运城金华
广西萍乡
大理重庆
诸暨泉州
安庆南充
武汉辽宁

JavaAOP实现监控日志功能

2月2日 斩情道投稿
  Java知识点整理正在进行中,关注我,持续给您带来简单,实用的Java编程技巧。
  最近在做一个接口项目,需要一个能够记录接口运行情况的监控日志。想在日志中记录:接口的输入参数,返回结果调用接口的IP地址,调用的是那个接口接口运行时的异常信息接口的响应时间
  结合具体的使用环境,还需要:希望记录日志能以统一的方式运行,记录日志的代码不写在具体的业务逻辑中可以方便的设置是否记录日志在设置时可以灵活地确定记录在那个日志文件中
  针对以上要求,结合前阵子做过的一个自定义注解记录接口运行时间的例子,发现这个需求可以认为是之前例子的升级版。整体思路梳理了下:使用AOP来截取调用接口的相关信息,包括请求的IP,请求的是那个接口,调用的参数和返回结果,还有异常信息使用自定义注解来确定是否记录日志使用注解的参数来确定日志记录到那个文件中
  这样做就可以实现:业务代码与日志代码的解耦监控日志业务的灵活运用,可以方便的决定那个业务进行监控,同时可以灵活的调整日志记录在那个文件中
  好,说干就干,代码开撸。1。引入依赖!AOP依赖dependencygroupIdorg。springframework。bootgroupIdspringbootstarteraopartifactIddependency!获取运行时长dependencygroupIdcom。google。guavagroupIdguavaartifactIdversion23。0versiondependency!转义JSONdependencygroupIdcom。alibabagroupIdfastjsonartifactIdversion1。2。75versiondependency2。编写自定义注解MonitorLogpackagecom。bbzd。mws。importjava。lang。annotation。ElementTimportjava。lang。annotation。Rimportjava。lang。annotation。RetentionPimportjava。lang。annotation。T用于监控日志的注解authormilldate2022101411:54Target(ElementType。METHOD)Retention(RetentionPolicy。RUNTIME)publicinterfaceMonitorLog{Stringvalue();}3。AOP的实现类packagecom。bbzd。mws。importcom。alibaba。fastjson。JSON;importcom。bbzd。mws。annotation。MonitorLimportcom。google。common。base。Simportorg。aspectj。lang。ProceedingJoinPimportorg。aspectj。lang。Simportorg。aspectj。lang。annotation。Aimportorg。aspectj。lang。annotation。Aimportorg。aspectj。lang。annotation。Pimportorg。aspectj。lang。reflect。MethodSimportorg。slf4j。Limportorg。slf4j。LoggerFimportorg。springframework。stereotype。Cimportorg。springframework。web。context。request。RequestContextHimportorg。springframework。web。context。request。ServletRequestAimportjavax。servlet。http。HttpServletRimportjavax。servlet。http。HttpServletRimportjava。util。ArrayLimportjava。util。Limportjava。util。concurrent。TimeU业务监控日志记录内容:请求IP,请求URI,业务类名,方法名,输入参数,返回值,异常信息date2022101210:12ComponentAspectpublicclassRequestParameterAOP{以注解MonitorLog标记的方法为切入点Pointcut(annotation(com。bbzd。mws。annotation。MonitorLog))publicvoidmethodArgs(){}Around(methodArgs())publicObjectinvoke(ProceedingJoinPointjoinPoint)throwsThrowable{StringBufferstringBuffernewStringBuffer();OStopwatchstopwatchStopwatch。createStarted();HttpServletRequesthttpServletRequest((ServletRequestAttributes)RequestContextHolder。getRequestAttributes())。getRequest();StringipAddrgetRemoteHost(httpServletRequest);StringrequestUrlhttpServletRequest。getRequestURI();stringBuffer。append(请求源IP〔ipAddr〕;);stringBuffer。append(请求URL〔requestUrl〕;);SignaturesignaturejoinPoint。getSignature();MethodSignaturemethodSignature(MethodSignature)类名String〔〕sourceNamesignature。getDeclaringTypeName()。split(。);StringfullNamesignature。getDeclaringTypeName();StringclassNamesourceName〔sourceName。length1〕;方法名StringmethodNamesignature。getName();stringBuffer。append(className。methodN);参数名数组String〔〕parameterNamesmethodSignature。getParameterNames();Class〔〕parameterTypesmethodSignature。getParameterTypes();构造参数组集合ListObjectargListnewArrayList();for(Objectarg:joinPoint。getArgs()){requestresponse无法使用toJSONif(arginstanceofHttpServletRequest){argList。add(request);}elseif(arginstanceofHttpServletResponse){argList。add(response);}else{argList。add(JSON。toJSON(arg));}}stringBuffer。append(请求参数:JSON。toJSON(parameterNames)JSON。toJSON(argList));try{resultjoinPoint。proceed();}catch(Exceptione){stringBuffer。append(异常:e。getMessage());log。info(获取参数失败:{},e。getMessage());}stopwatch。stop();longtimeConsumingstopwatch。elapsed(TimeUnit。MILLISECONDS);if(result!null){stringBuffer。append(请求结果:JSON。toJSON(result));}else{stringBuffer。append(请求结果:无);}stringBuffer。append(请求耗时:timeConsuming毫秒);LoggerloggergetLogger(fullName,methodName,parameterTypes);logger。info(stringBuffer。toString());}从请求中获取请求源IPparamrequestreturn请求源IPprivateStringgetRemoteHost(HttpServletRequestrequest){Stringiprequest。getHeader(xforwardedfor);if(ipnullip。length()0unknown。equalsIgnoreCase(ip)){iprequest。getHeader(ProxyClientIP);}if(ipnullip。length()0unknown。equalsIgnoreCase(ip)){iprequest。getHeader(WLProxyClientIP);}if(ipnullip。length()0unknown。equalsIgnoreCase(ip)){iprequest。getRemoteAddr();}returnip。contains(0:0:0:0:0:0:0:1)?127。0。0。1:}根据MonitorLog注解中的值,返回LoggerparamclassNameMonitorLog所在方法对应的类名parammethodNameMonitorLog所在方法对应的方法名paramparamTypesMonitorLog所在方法对应的参数名returnprivateLoggergetLogger(StringclassName,StringmethodName,Class〔〕paramTypes){StringlogNamecom。bbzd。mws。try{ClassclazzClass。forName(className);logNameclazz。getDeclaredMethod(methodName,paramTypes)。getAnnotation(MonitorLog。class)。value();}catch(Exceptione){e。printStackTrace();}LoggerloggerLoggerFactory。getLogger(logName);}}4。业务逻辑方法Overridecom。bbzd。mws。aop是logger的名称,需要在日志文件中进行对应的配置MonitorLog(valuecom。bbzd。mws。aop)publicUsergetUserName(ValidRequestBodyWebParam(nameUserVo)UserVovo)throwsConstraintViolationException{UserusernewUser(vo。getName(),vo。getAge());try{模拟异常情况,测试异常信息的记录inti10;}catch(NullPointerExceptionexception){exception。printStackTrace();}}5。日志配置文件!name属性值需要与注解的value属性值一样loggernamecom。bbzd。mws。aoplevelDEBUGadditivityfalselogger6。日志记录内容示例〔11:11:59。266〕〔INFO〕〔com。bbzd。mws。aop〕〔httpnio8889exec1〕请求源IP〔127。0。0。1〕;请求URL〔mwswsuser〕;UserServiceImpl。getUserN请求参数:〔vo〕〔{name:powerful,age:10}〕请求结果:{name:powerful,age:10}请求耗时:56毫秒
  总结POM文件是代码片段配置文件是logback的代码片段其它文件是完整的代码关于logback日志框架及logback配置文件的使用方法,后面会整理一篇文章详细介绍下,想了解的小伙伴可以关注我。
投诉 评论 转载

1990年张学良被释放,记者问他最想见谁,他竟说出了一位汉奸1936年,在与杨虎城一起发动了西安事变之后,张学良就遭到了蒋介石的软禁,这场软禁从1936年年底,一直持续到了1990年。在这长达半个多世纪的软禁解除后,张学良终于恢复……历史上的欧洲支付联盟(EPU)1947年,英镑危机挫败了将跨大西洋金融经济管理扩展到布雷顿森林体系之外的雄心勃勃的计划。此外,一个极其寒冷的冬天在欧洲引发了煤炭危机,寥寥无几的收成导致了更紧迫的粮食短缺,西……农村大批青壮年背井离乡外出务工,他们的辛酸和无奈你知道多少?中国农村大部分富余劳力成为城市建设者,这就是中国农村当下特有的模式。很多青年人为了生存,不得不背井离乡,其中一部分人被迫成为农民工。因为他们被生活所逼,没有文凭,没有技术,没有……国家能源局推进虚拟电厂重点标准制修订央广网北京10月9日消息10月9日,国家能源局印发《能源碳达峰碳中和标准化提升行动计划》(以下简称《行动计划》),提出建立和完善虚拟电厂标准体系,推进虚拟电厂领域重点标准制修订……TCL98寸电视机和红米98寸电视机哪款好?如果前一年问我,98寸电视机选TCL还是红米的好,或许我还犹豫一些,但是今年,就不用犹豫了,肯定选TCL的98Q6E呀,硬件上的碾压,可谓是大屏电视性价比的天花板。TCL……各地组团出海助力企业开拓市场抢抓国际订单央广网北京12月10日消息据中央广播电视总台中国之声《新闻和报纸摘要》报道,江苏、浙江、四川等地各级商务部门连日来组团赴海外开展商务活动,帮助企业开拓市场、抢抓国际订单。……犯罪心理学有哪些用途?犯罪心理通常是指犯罪主体在犯罪活动中的心理,犯罪心理学就是研究在犯罪发生的自始至终,犯罪人的心理是如何发展变化的,有何规律。犯罪心理与犯罪行为的区别与联系:1、犯罪心理是……二十大代表风采白静用心用情办好每一起案件在党的二十大代表中,有这样一位基层检察官。7年来,她经手过不少环境公益诉讼案件,她探索的符合边疆生态特点的公益司法保护模式,在内蒙古自治区推广。她就是二十大代表、内蒙古自治区呼……全民品鉴官带你打开夜生活的新姿势!夜晚的城市,更有别样的烟火气息一方夜市映衬着一个城市的繁华本期节目全民品鉴官们来到佛山三水的蓝色蜗居庄园不仅来感受夜市的热闹而且还打算……JavaAOP实现监控日志功能Java知识点整理正在进行中,关注我,持续给您带来简单,实用的Java编程技巧。最近在做一个接口项目,需要一个能够记录接口运行情况的监控日志。想在日志中记录:接口的输入参……孩子眼睛有散光,什么情况下必须戴眼镜?还能恢复正常吗?我们的大脑每天通过五种感觉来接收外部信息,它们接收外部信息的比例分别为:味觉1、触觉1。5、嗅觉3。5、听觉11、视觉83。如果作为视觉接受的最大器官眼睛,一旦出现问题,……美军打赢海湾战争,整体实力被吹到天上去了,但只是恃强凌弱说到美国新世纪的几个大动作,可以说外界并不陌生,比如海湾战争,伊拉克战争等等。其中海湾战争,外界记忆犹新。毕竟当初包括美国在内的联军用了40天,地面战斗只用了100个小时就取得……
为什么有的女人,40以后眼角没皱纹,身材依旧那么好?前央视一姐周涛任大型歌会导演,皮肤白到发光,一件衬衫穿十几年如何将基础款高腰裤穿出气质?看这4点就行了,美得高级大家的正装皮鞋都什么牌子,能否推荐一下?想问下大家,前一天晚上刚夸了喜欢的女生穿的衣服很适合很配她,39岁安妮海瑟薇一袭蓝裙亮相,皮肤松弛暴露大象腿,但眼神自信最近熬夜长了很多痘痘,有什么办法可以快速去除痘痘吗?新手现在做服装尾货能赚钱吗?他们用玻璃做了个水晶包,卖得死贵,外国明星还狂爱贾红松穿旗袍的母亲连衣裙有修身显瘦的效果,那么胖一点的女性该如何穿裙装?毛孔粗怎么解决?图暹罗猫性格五大主要特征猫咪爱记仇报复心强图巴黎圣母院高度堪比黄金比例雨果赞其为石头的交响乐使用婴儿润肤油要注意什么夫妻起诉离婚在哪里都可以吗通古斯人种特征眼睛小脸型长是蒙古人种的一大分支榆树小学作文百日草怎么浇水四季不同浇水方法好声音第三季学员发型大pk耿斯汉发型很有个性小学信息技术教案致命开门杀,蜀黍教你规避它秦岚曾黎范冰冰,盘点那些越老越有味道的女明星大连警方紧急提醒这个号段来电,慎接

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找七猫云易事利