springboot使用aop記錄介面操作日誌
阿新 • • 發佈:2020-12-25
技術標籤:後端aopspring boot
- 國際慣例,新增依賴
- 我們先自定義一個註解,有關自定義註解的說明可自行百度。
@Target({ ElementType.PARAMETER, ElementType.METHOD }) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Log { /** * 模組 */ String title() default ""; /** * 功能 */ BusinessType businessType() default BusinessType.OTHER; }
- 切面類編寫
@Aspect @Component public class LogAspect { private static final Logger log = LoggerFactory.getLogger(LogAspect.class); @Autowired private SysOperateLogService sysOperateLogService; /**配置切入點*/ @Pointcut("@annotation(com.ews.framework.common.annotation.Log)") public void logPointCut() { } /** * 處理完請求後執行 * @param joinPoint 切點 */ @AfterReturning(pointcut = "logPointCut()", returning = "jsonResult") public void doAfterReturning(JoinPoint joinPoint, Object jsonResult) { handleLog(joinPoint, null, jsonResult); } /** * 攔截異常操作 * @param joinPoint 切點 * @param e 異常 */ @AfterThrowing(value = "logPointCut()", throwing = "e") public void doAfterThrowing(JoinPoint joinPoint, Exception e) { } /** * 日誌處理邏輯 * @param point 切點 * @param e 異常 * @param jsonResult json結果 */ public void handleLog(final JoinPoint point, final Exception e, Object jsonResult) { Signature signature = point.getSignature(); MethodSignature methodSignature = (MethodSignature) signature; Method method = methodSignature.getMethod(); if (method == null){ return; } //系統操作日誌 SysOperateLog sysOperateLog = new SysOperateLog(); sysOperateLog.setId(IdUtils.simpleUUID()); //獲取註解資訊 Log logAnnotation = method.getAnnotation(Log.class); if (logAnnotation == null){ return; } //請求的方法名 String className = point.getTarget().getClass().getName(); String methodName = point.getSignature().getName(); sysOperateLog.setRequestMethod(className + "." + methodName + "()"); sysOperateLog.setRequestWay(ServletUtils.getRequest().getMethod()); sysOperateLog.setRequestIp(ServletUtils.getRequest().getRemoteAddr()); sysOperateLog.setRequestUrl(ServletUtils.getRequest().getRequestURI()); sysOperateLog.setResultParam(StringUtils.substring(JSON.toJSONString(jsonResult), 0, 2000)); sysOperateLog.setOperateStatus(BusinessStatus.SUCCESS.ordinal()); if (e != null) { sysOperateLog.setOperateStatus(BusinessStatus.FAIL.ordinal()); sysOperateLog.setErrorMessage(StringUtils.substring(e.getMessage(), 0, 2000)); } sysOperateLog.setOperateTime(new Date()); //處理設定註解上的引數 getControllerMethodDescription(logAnnotation, sysOperateLog); //請求的方法引數值 Object[] args = point.getArgs(); sysOperateLog.setRequestParam(JSON.toJSONString(args)); log.info("===引數為:" + JSON.toJSONString(args)); //請求的方法引數名稱 LocalVariableTableParameterNameDiscoverer u = new LocalVariableTableParameterNameDiscoverer(); sysOperateLog.setId(IdUtils.randomUUID()); sysOperateLogService.insertSysOperateLog(sysOperateLog); } /** * 獲取註解中對方法的描述資訊 用於Controller層註解 * @param log 日誌 * @param operLog 操作日誌 */ public void getControllerMethodDescription(Log log, SysOperateLog operLog) { //設定action動作 operLog.setBusinessType(log.businessType().ordinal()); //設定標題 operLog.setOperateTitle(log.title()); } }
- controller介面新增@Log註解。