当前位置: 首页 > 后端技术 > Java

SpringBootAOP扫盲,实现接口访问的统一日志记录

时间:2023-04-01 19:11:33 Java

AOP鏄疭pring浣撶郴涓袱涓潪甯搁噸瑕佺殑姒傚康涔嬩竴锛堝彟涓€涓槸IoC锛夛紝浠婂ぉ杩欑瘒鏂囩珷灏卞甫澶у瀹炴垬涓€涓嬶紝鍦ㄧ紪绋嬬尗SpringBoot椤圭洰浣跨敤AOP鎶€鏈湪controller灞傚鍔犱竴涓垏闈紝瀹炵幇鎺ュ彛璁块棶鐨勭粺涓€鏃ュ織璁板綍銆?銆佸叧浜嶢OPAOP锛屽嵆Aspect-orientedProgramming锛岀炕璇戜负闈㈠悜鍒囬潰缂栫▼锛屾槸璁$畻鏈虹瀛︿腑鐨勪竴绉嶈璁℃€濇兂锛屾棬鍦ㄩ€氳繃鍒囬潰鎶€鏈负涓氬姟涓讳綋澧炲姞棰濆鐨勫缓璁紙Advice锛夛紝浠庤€屽0鏄庝负鈥滃垏鐐光€濓紙Pointcut锛変唬鐮佸潡杩涜缁熶竴绠$悊鍜屼慨楗般€傝繖绉嶆€濊矾闈炲父閫傜敤浜庡湪绋嬪簭涓姞鍏ヤ笌鏍稿績涓氬姟鍏崇郴涓嶆槸閭d箞瀵嗗垏鐨勫姛鑳斤紝灏卞儚鎴戜滑浠婂ぉ鐨勮瘽棰樷€斺€旀棩蹇楀姛鑳藉氨鏄竴涓吀鍨嬫渚嬨€侫OP鏄潰鍚戝璞$紪绋嬶紙淇楃ОOOP锛夌殑琛ュ厖銆侽OP鐨勬牳蹇冨崟鍏冩槸class锛岃€孉OP鐨勬牳蹇冨崟鍏冩槸aspect銆侫OP鍙互鐢ㄦ潵闅旂涓氬姟閫昏緫鐨勫悇涓儴鍒嗭紝浠庤€岄檷浣庤€﹀悎锛屾彁楂樼▼搴忕殑澶嶇敤鎬э紝鎻愰珮寮€鍙戞晥鐜囥€傛垜浠彲浠ョ畝鍗曠殑鎶夾OP鐞嗚В涓鸿疮绌挎柟娉曠殑鎿嶄綔锛屾柟娉曟墽琛屽墠銆佹墽琛屼腑銆佹墽琛屽悗銆佽繑鍥炲€煎悗銆佸紓甯稿悗銆?銆丄OP鐩稿叧鏈鐪嬩笅鍥撅紝鏄竴寮燗OP妯″瀷鍥撅紝灏辨槸鍦ㄦ煇浜涙柟娉曟墽琛屽墠鍚庤繘琛屼竴浜涘父鐢ㄧ殑鎿嶄綔锛岃€岃繖浜涙搷浣滀笉浼氬奖鍝嶇▼搴忔湰韬殑杩愯銆備笅闈㈡潵浜嗚В涓€涓婣OP娑夊強鐨?涓叧閿湳璇細1锛夋í鍒囧叧娉ㄧ偣锛屼粠姣忎釜鏂规硶涓娊鍙栧嚭鐨勫悓绫诲瀷闈炴牳蹇冧笟鍔?锛堿spect锛屽皝瑁呮í鍒囧叧娉ㄧ偣鐨勭被锛屾瘡涓叧娉ㄧ偣琛ㄧず涓轰竴涓€氱煡鏂规硶;閫氬父涓€涓柟闈㈡槸浣跨敤@Aspect娉ㄩ噴瀹氫箟鐨勩€?锛夊缓璁紙Advice锛夛紝鍒囬潰蹇呴』瀹屾垚鐨勫叿浣撲换鍔°€傛瘮濡傛垜浠殑鏃ュ織鏂归潰闇€瑕佽褰曟帴鍙h皟鐢ㄥ墠鍚庣殑鏃堕棿锛岄偅涔堟垜浠氨闇€瑕佽褰曡皟鐢ㄦ帴鍙e墠鍚庣殑鏃堕棿锛岀劧鍚庡彇宸€笺€傞€氱煡鏂规硶鏈変簲绉嶏細@Before锛氶€氱煡鏂规硶浼氬湪鐩爣鏂规硶璋冪敤鍓嶆墽琛孈After锛氶€氱煡鏂规硶浼氬湪鐩爣鏂规硶璋冪敤鍚庢墽琛孈AfterReturning锛氶€氱煡鏂规硶浼氬湪鐩爣鏂规硶杩斿洖鍚庢墽琛孈AfterThrowing锛氶€氱煡鏂规硶浼氬湪鐩爣鏂规硶鎶涘嚭寮傚父鍚嶦xecute@Around涔嬪悗鎵ц锛氬寘瑁呮暣涓洰鏍囨柟娉曪紝鍦ㄨ皟鐢ㄥ墠鍚庢墽琛岄€氱煡鏂规硶4锛夊姞鍏ョ偣锛圝oinPoint锛夛紝閫氱煡鐨勬椂鏈篴pplication锛屾瘮濡傝皟鐢ㄦ帴鍙f柟娉曟椂锛屽氨鏄痩og鍒囬潰鐨勮繛鎺ョ偣銆?)Pointcut锛屽簲鐢ㄩ€氱煡鍔熻兘鐨勮寖鍥淬€傛瘮濡傛湰鏂囨棩蹇楁柟闈㈢殑搴旂敤鑼冨洿鏄墍鏈塩ontroller鎺ュ彛銆傚垏鍏ョ偣琛ㄨ揪寮忛€氬父浣跨敤@Pointcut娉ㄩ噴瀹氫箟銆傚垏鍏ョ偣琛ㄨ揪寮忕殑璇硶鏍煎紡瑙勮寖濡備笅锛氱鍙穜et-type-pattern鏄繑鍥炵被鍨嬶紝閫氬父鐢?鏉ヨ〃绀轰换浣曡繑鍥炵被鍨媎eclaring-type-pattern?鏄寘鍚峮ame-pattern鏄柟娉曞悕锛屽彲浠ョ敤*琛ㄧず鍏ㄩ儴锛屼篃鍙互鐢╯et*琛ㄧず鍏ㄩ儴浠et寮€澶磒aram-pattern鐨勭被鍚嶏級鏄弬鏁扮被鍨嬶紝澶氫釜鍙傛暟鍙互鐢?闅斿紑participant涔熷彲浠ョ敤*鏉ヨ〃绀烘墍鏈夌被鍨嬬殑鍙傛暟锛?..)涔熷彲浠ョ敤鏉ヨ〃绀洪浂鎴栦换鎰忓弬鏁皌hrows-pattern锛熷畠鏄紓甯哥被鍨嬪悧锛熻〃绀哄墠闈竴涓槸鍙€夌殑渚嬪锛欯Pointcut("execution(public*com.codingmore.controller.*.*(..))")琛ㄧずcom.codingmore.controller鍖呬笅鐨勬墍鏈塸ublicmethods鍒囬潰鐨凙dvice蹇呴』搴旂敤銆?.瀹炴垬AOP璁板綍鎺ュ彛璁块棶鏃ュ織绗竴姝ユ槸鍦⊿pringBoot椤圭洰鐨刾om.xml鏂囦欢涓坊鍔爏pring-boot-starter-aop渚濊禆銆?dependency>org.springframework.bootspring-boot-starter-aop绗簩姝ユ坊鍔犳棩蹇椾俊鎭皝瑁呯被WebLog璁板綍浠€涔堟牱鐨勬搷浣?璋佸湪鎿嶄綔,寮€濮嬫椂闂?鑰楁椂,鎿嶄綔璺緞,鎿嶄綔鏂规硶鍚?鎿嶄綔涓绘満IP,璇锋眰鍙傛暟,杩斿洖缁撴灉绛?***Controller灞傜殑鏃ュ織灏佽绫?2018骞村畯鍒涘缓/4/26銆?/publicclassWebLog{绉佹湁瀛楃涓叉弿杩帮紱绉佹湁瀛楃涓茬敤鎴峰悕锛涚浜洪暱寮€濮嬫椂闂达紱绉佷汉鏁存暟鑺辫垂鏃堕棿锛涚浜哄瓧绗︿覆鍩烘湰璺緞锛涚鏈夊瓧绗︿覆uri绉佹湁瀛楃涓瞮rl锛涚鏈夊瓧绗︿覆鏂规硶锛涚鏈夊瓧绗︿覆ip锛涚鏈夊璞″弬鏁帮紱绉佹湁瀵硅薄缁撴灉锛?/鐪佺暐getter鍜宻etter鏂规硶}绗笁姝ワ紝娣诲姞缁熶竴鐨勬棩蹇楀鐞嗗垏闈ebLogAspect銆?***缁熶竴鏃ュ織澶勭悊鍒囬潰*鐭崇鍒涘缓*/@Aspect@Component@Order(1)publicclassWebLogAspect{privatestaticfinalLoggerLOGGER=LoggerFactory.getLogger(WebLogAspect.class);@Pointcut("execution(public*com.codingmore.controller.*.*(..))")publicvoidwebLog(){}@Before("webLog()")publicvoiddoBefore(JoinPointjoinPoint)throwsThrowable{}@AfterReturning(value="webLog()",returning="ret")publicvoiddoAfterReturning(Objectret)throwsThrowable{}@Around("webLog()")publicObjectdoAround(ProceedingJoinPointjoinPoint)throwsThrowable{longstartTime=System.currentTimeMillis();//鑾峰彇褰撳墠璇锋眰瀵硅薄ServletRequestAttributesattributes=(ServletRequestAttributes)RequestContextHolder.getRequestAttributes();HttpServletRequest璇锋眰=attributes.getRequest();//璁板綍璇锋眰淇℃伅锛堥€氳繃Logstash浼犻€掔粰Elasticsearch锛塛ebLogwebLog=newWe鍗氬锛堬級;瀵硅薄缁撴灉=joinPoint.proceed();绛惧悕signature=joinPoint.getSignature();MethodSignaturemethodSignature=(MethodSignature)绛惧悕锛涙柟娉昺ethod=methodSignature.getMethod();濡傛灉(method.isAnnotationPresent(ApiOperation.class)){ApiOperationlog=method.getAnnotation(ApiOperation.class);webLog.setDescription(log.value());}longendTime=System.currentTimeMillis();StringurlStr=request.getRequestURL().toString();webLog.setBasePath(StrUtil.removeSuffix(urlStr,URLUtil.url(urlStr).getPath()));webLog.setIp(request.getRemoteUser());MaplogMap=newHashMap<>();logMap.put("spendTime",webLog.getSpendTime());logMap.put("鎻忚堪",webLog.getDescription());LOGGER.info("{}",JSONUtil.parse(webLog));杩斿洖缁撴灉锛泒}绗洓姝ワ紝杩愯椤圭洰锛屽苟缁х画roller涓嬬殑涓€涓猚ontroller娴嬭瘯浜哠waggerknife4j璁块棶鍦板潃锛歨ttp://localhost:9022/doc.html鎵ц鐧诲綍鐢ㄦ埛鏌ヨ鎿嶄綔锛氬湪鎺у埗鍙板彲浠ョ湅鍒板涓嬫棩蹇椾俊鎭細婧愮爜鍦板潃锛歨ttps://github銆俢om/itwanger/c...鍙傝€冮摼鎺ワ細浣滆€卌xuan锛歨ttps://www.cnblogs.com/cxuan...鐏板皬鐚匡細https://bbs.huaweicloud.com/b...灞遍珮formeFeng:https://www.cnblogs.com/liaoj...macrozheng:https://github.com/macrozheng...鏈枃宸茶寮€婧愪笓鏍忋€奐ava 绋嬪簭鍛樿繘闃朵箣璺€嬫敹褰?.6k+starGitHub銆傛嵁璇存瘡涓紭绉€鐨凧ava绋嬪簭鍛橀兘鍠滄濂癸紝骞介粯椋庤叮锛岄€氫織鏄撴噦銆傚唴瀹瑰寘鎷琂ava鍩虹銆丣ava骞跺彂缂栫▼銆丣ava铏氭嫙鏈恒€丣ava浼佷笟绾у紑鍙戙€丣ava闈㈣瘯绛夋牳蹇冪煡璇嗙偣銆傚涔燡ava锛屽彧涓哄鎵綣ava绋嬪簭鍛樼殑杩涢樁涔嬭矾馃槃銆俬ttps://github.com/itwanger/toBeBetterJavaerstar杩欎釜瀛樺偍搴撴剰鍛崇潃浣犳湁娼滃姏鎴愪负涓€鍚嶄紭绉€鐨凧ava宸ョ▼甯堛€備篃鍙互鐐瑰嚮涓嬫柟閾炬帴璺宠浆鍒般€奐ava 绋嬪簭鍛樿繘闃朵箣璺€嬪畼缃戯紝寮€鍚剦蹇殑瀛︿範涔嬫梾銆俬ttps://tobebetterjavaer.com/娌℃湁浠€涔堣兘闃绘鎴戔€斺€旈櫎浜嗙洰鐨勶紝鍗充娇宀歌竟鏈夌帿鐟般€佺豢鑽拰瀹侀潤鐨勬腐婀撅紝鎴戜篃涓嶅彈鏉熺細銆?/p>