SpringBoot AOP處理請求日誌列印功能程式碼例項
阿新 • • 發佈:2020-03-27
設計原則和思路:
- 元註解方式結合AOP,靈活記錄操作日誌
- 能夠記錄詳細錯誤日誌為運營以及審計提供支援
- 日誌記錄儘可能減少效能影響
- 操作描述引數支援動態獲取,其他引數自動記錄。
程式碼例項如下
@Slf4j @Aspect @Configuration public class RequestAopConfig { @Autowired private HttpServletRequest request; private static final ThreadLocal<Long> START_TIME_MILLIS = new ThreadLocal<>(); @Pointcut("execution(* com.xxx.xxx.xxx..*(..)) " + "&&(@annotation(org.springframework.web.bind.annotation.PostMapping)" + "||@annotation(org.springframework.web.bind.annotation.GetMapping)" + "||@annotation(org.springframework.web.bind.annotation.PutMapping)" + "||@annotation(org.springframework.web.bind.annotation.DeleteMapping))") public void controllerMethodPointcut() { } /** * 前置通知:在某連線點之前執行的通知,但這個通知不能阻止連線點之前的執行流程(除非它丟擲一個異常)。 * * @param joinPoint 引數 */ @Before("controllerMethodPointcut()") public void before(JoinPoint joinPoint) { START_TIME_MILLIS.set(System.currentTimeMillis()); } /** * 後置通知:在某連線點正常完成後執行的通知,通常在一個匹配的方法返回的時候執行。 * * @param joinPoint 引數 */ @AfterReturning(value = "controllerMethodPointcut()",returning = "result") public void afterReturning(JoinPoint joinPoint,Object result) { String logTemplate = "--------------- 執行成功 ---------------\n請求開始---Send Request URL: {},Method: {},Params: {} \n請求方法---ClassName: {},[Method]: {},execution time: {}ms \n請求結束---Send Response Result: {}"; log.info(logTemplate,request.getRequestURL(),request.getMethod(),JSON.toJSONString(joinPoint.getArgs()),joinPoint.getSignature().getDeclaringTypeName(),joinPoint.getSignature().getName(),(System.currentTimeMillis() - START_TIME_MILLIS.get()),JSON.toJSONString(result)); START_TIME_MILLIS.remove(); } /** * 異常通知:在方法丟擲異常退出時執行的通知。 * * @param joinPoint 引數 */ @AfterThrowing(value = "controllerMethodPointcut()",throwing = "ex") public void afterThrowing(JoinPoint joinPoint,Throwable ex) { String logTemplate = "--------------- 執行失敗 ---------------\n異常請求開始---Send Request URL: {},Params: {} \n異常請求方法---ClassName: {},execution time: {}ms \n異常請求結束---Exception Message: {}"; log.error(logTemplate,ex.getMessage()); START_TIME_MILLIS.remove(); } /** * 最終通知。當某連線點退出的時候執行的通知(不論是正常返回還是異常退出)。 * * @param joinPoint */ @After("controllerMethodPointcut()") public void after(JoinPoint joinPoint) { } }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。