城市直播房产教育博客汽车
投稿投诉
汽车报价
买车新车
博客专栏
专题精品
教育留学
高考读书
房产家居
彩票视频
直播黑猫
投资微博
城市上海
政务旅游

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个小时就取得……
太空跨尺度能量如何传输?我国学者有最新发现正装需要配丝袜吗?1930年牺牲的江西省委书记张国庶张国焘亲弟,儿子孙子都在台45岁不工作,无其他生活负担,有150w存款,能不能生活到6中国网络文明大会最高法我国互联网司法成效显著一分一段表!江苏2022高考成绩排名出炉,600分以上1。4有编制的事业单位人员可以调动工作吗?鞋子开胶别用502粘,伤鞋!教你正确做法,美观牢固不开胶7个鬼子不断逼近一名女兵,甚至一个已经脱裤子猥琐地向她走去万亿茅台斥资10亿拿地,发力文旅康养业务?专家多元化初见端倪考研的重点是复试吗?导师复试看重什么?做一个积极乐观的人,做一个集大成者,做一个对人有用的人
第一阶段协议的意义和影响蓝虎眼石价格虎眼石中的上品全球化语境下的大国分歧治理思路蚂蚁庄园今日问题在芝麻信用完成以下哪个任务可以获得芝麻粒支付唐氏筛查主要检查项目有哪些?史称造句用史称造句大全观察蜗牛日记一个后创业者的自白创业失败差点露宿街头柳家寻幽录(32乡村巡逻记)你知道什么是农村土地承包经营权确权登记颁证吗?收获水润肌:什么牌子的护肤品补水效果最好终于!

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找江西南阳嘉兴昆明铜陵滨州广东西昌常德梅州兰州阳江运城金华广西萍乡大理重庆诸暨泉州安庆南充武汉辽宁