您好,登錄后才能下訂單哦!
封裝系統全局操作日志aop攔截且可打包給其他項目依賴,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
在開發過程中,為了更快地排錯,更好得了解接口訪問量,可以選擇用aop做全局的操作攔截,在項目不止一個的時候,我們可以選擇獨立出來,新項目可以很快的加上全局操作日志,具體代碼及數據庫表設計如下:
1.數據庫MySQL表結構設計,如下圖(可根據需要加減字段):
2.可以根據表結構逆向生成相關實體類及Mapper,此步驟相對簡單(略)
3.增加全局日志切面類
** * @author songlonghui * @ClassName SystemLogAspect * @Description 日志切面記錄 * @date 2019/7/24 16:38 * @Version 1.0 */ @Component @Aspect public class SystemLogAspect { private Logger logger = LoggerFactory.getLogger(SystemLogAspect.class); @Autowired private SystemLogDao systemLogDao; /*@Value("${LOG_POINT_URL}") private String logPointUrl;*/ /** 以 controller 包下定義的所有請求為切入點 */ @Pointcut("execution(public * com.machinsight.*.*.controller..*.*(..)) && !@annotation(com.machinsight.system_log.core.annotation.NoAspectAnnotation)") public void webLog() { //logger.warn("切點路徑---------->" + logPointUrl); } //private SystemLogWithBLOBs systemLogWithBLOBs; /** * 在切點之前織入 * @param joinPoint * @throws Throwable */ @Before("webLog()") public void doBefore(JoinPoint joinPoint) throws Throwable { // 開始打印請求日志 //logger.info("=========================================== Start ==========================================="); } /** * 在切點之后織入 * @throws Throwable */ @After("webLog()") public void doAfter() throws Throwable { logger.info("=========================================== End ==========================================="); // 每個請求之間空一行 logger.info(""); } /** * 環繞 * @param proceedingJoinPoint * @return * @throws Throwable */ @Around("webLog()") public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { // 開始時間 long startTime = System.currentTimeMillis(); SystemLogWithBLOBs systemLogWithBLOBs = new SystemLogWithBLOBs(); ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); if (null != attributes){ HttpServletRequest request = attributes.getRequest(); logger.error("當前線程號:--doAround--" + Thread.currentThread()); String url = request.getRequestURL().toString(); String description = proceedingJoinPoint.getSignature().getDeclaringTypeName(); String requestArgs = FastJsonUtils.toJSONNoFeatures(proceedingJoinPoint.getArgs()).replaceAll("\\\\",""); String ip = UuidUtil.getIpAddr(request); // 打印請求相關參數 logger.info("========================================== Start =========================================="); // 打印請求 url logger.info("請求URL : {}", url); // 打印 Http method logger.info("HTTP請求方法 Method : {}", request.getMethod()); // 打印調用 controller 的全路徑以及執行方法 logger.info("Class--Controller 全路徑以及執行方法 Method : {}.{}", description); // 打印請求的 IP logger.info("請求IP : {}", ip); // 打印請求入參 logger.info("請求參數Request Args : {}", requestArgs); // 記錄日志入庫 String value = request.getHeader("user-agent"); // 用戶代理信息 // systemLogWithBLOBs.setCreateTime(new Date()); // 請求參數 systemLogWithBLOBs.setMethod(url); // 接口地址 systemLogWithBLOBs.setRequestIp(ip); //請求ip systemLogWithBLOBs.setRequestArgs(requestArgs); // 請求參數 systemLogWithBLOBs.setUserAgent(value); // 用戶代理信息 systemLogWithBLOBs.setDescription(description); } Object result = null; try { result = proceedingJoinPoint.proceed(); String responseArgs = FastJsonUtils.toJSONNoFeatures(result).replaceAll("\\\\",""); long useTime = System.currentTimeMillis() - startTime; // 打印出參 logger.info("具體返回參數 Response Args : {}", responseArgs); // 執行耗時 logger.info("整體執行耗時 Time-Consuming : {} ms", useTime); systemLogWithBLOBs.setResponseArgs(responseArgs); systemLogWithBLOBs.setTimeConsuming(Integer.valueOf(String.valueOf(useTime))); } catch (Throwable throwable) { // 設置異常信息 systemLogWithBLOBs.setIsException(1); // 異常信息 systemLogWithBLOBs.setExceptionDetail(throwable.getMessage()); // 耗時 long exceptionTime = System.currentTimeMillis() - startTime; systemLogWithBLOBs.setTimeConsuming(Integer.valueOf(String.valueOf(exceptionTime))); // 異常返回參數 JsonResult jsonResult = new JsonResult(); jsonResult.setMsg(CrmConstant.OPS_FAILED_MSG); jsonResult.setSuccess(CrmConstant.OPS_FAILED_CODE); jsonResult.setData(throwable.getMessage()); String responseArgsForException = FastJsonUtils.toJSONNoFeatures(jsonResult); systemLogWithBLOBs.setResponseArgs(responseArgsForException); // 拋出異常 throw new Throwable(throwable.getMessage()); } finally { systemLogDao.insertSelective(systemLogWithBLOBs); } return result; }
4.可根據公司項目的整體包結構配置切點,還可以增加不需要攔截的配置,為了更靈活細化,這里增加了相應注解類,如下:
/** * 切面排除注解類 */ @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface NoAspectAnnotation { }
5.只要在不需要的攔截的controller方法加上注解@NoAspectAnnotation即可,切點會自動排除:
/** * @author songlonghui * @ClassName CommonController * @Description TODO * @date 2019/8/23 16:09 * @Version 1.0 */ @Controller @RequestMapping("common") public class CommonController { @ResponseBody @RequestMapping("/test") @NoAspectAnnotation public String testLog(@RequestBody String inputJson) throws Exception{ String msg = "操作成功"; return msg; } }
6.只要在別的項目中增加該項目依賴即可:
<!-- 全局日志切面 --> <dependency> <groupId>com.machinsight</groupId> <artifactId>system_log</artifactId> <version>0.0.1-SNAPSHOT</version> <exclusions> <exclusion> <artifactId>*</artifactId> <groupId>*</groupId> </exclusion> </exclusions> </dependency>
有需要整體項目源碼的朋友可以聯系我,現在還沒有想好源碼放在什么地方供別人下載!!
郵箱地址:lance911215@outlook.com
關于封裝系統全局操作日志aop攔截且可打包給其他項目依賴問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。