最近我們的接口中有兩個被調用的時候比較緩慢,一個查詢大概需要2-3秒的樣子,我們需要定位一下具體需要的時間秒數,就讓某猿過去實現了。提交代碼我review的時候我嚇了一跳,那那兩個類進行了手動統計時間,代碼就不貼了,這樣十分不好啊,如果以后要統計其他的controller或者service那就得手動再寫,所以我重寫了一份
我們需要對service以及controller進行統計,所以在springmvc.xml以及application-service.xml中都要開啟aspectj 注解
<!-- 自動創建代理 對@AspectJ注解的支持 --> <!-- 通知spring使用cglib而不是jdk的來生成代理方法 AOP可以攔截到Controller --> <aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
在這里我們使用@Around通知來進行針對service的切面攔截,
@Aspect @Component public class LogServiceTakeTime { final static Logger log = LoggerFactory.getLogger(LogServiceTakeTime.class); @Pointcut("execution(* com.javasxy.service..*.*(..))") // @Pointcut("execution(* com.javasxy.web.controller.*.*(..))") public void performance(){ } @Around("performance()") public Object doLog(ProceedingJoinPoint joinPoint) throws Throwable { //記錄起始時間 long begin = System.currentTimeMillis(); Object result = ""; /** 執行目標方法 */ try{ result= joinPoint.proceed(); } catch(Exception e){ log.error("日志記錄發生錯誤, errorMessage: {}", e.getMessage()); } finally{ /** 記錄操作時間 */ long took = System.currentTimeMillis() - begin; if (took > 5000) { log.error("Service 執行時間為: {}毫秒", took); // log.error("Controller 執行時間為: {}毫秒", took); } else if (took > 2000) { log.warn("Service 執行時間為: {}毫秒", took); // log.warn("Controlle r執行時間為: {}毫秒", took); } else { log.info("Service執行時間為: {}毫秒", took); // log.info("Controller 執行時間為: {}毫秒", took); } // TODO 日志保存到MongoDB中 } return result; } }
這里就寫的十分簡單了,針對不同的耗時分別輸出打印日志的類型
有部分朋友喜歡把數據保存到數據庫中,其實我不推薦,最好是存入mongodb中即可,一來減少數據庫壓力,一來便於日后對日志進行分析統計以及報表制作。
最后的輸出是這樣的