通過日志定位分析接口調用緩慢的原因


最近我們的接口中有兩個被調用的時候比較緩慢,一個查詢大概需要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中即可,一來減少數據庫壓力,一來便於日后對日志進行分析統計以及報表制作。

最后的輸出是這樣的

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM