spring项目中监控方法执行时间

当项目规模越来越大时,难免会遇到性能问题。尤其是多系统之间接口调用,所以添加时间监控很有必要。但是由于代码已经上线,所以要保证对代码的侵略性最小,所以Spring AOP可以解决这个问题。

首先定义监控方法

package com.project.common.util;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.time.StopWatch;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Created by manong on 2016/9/2.
 * Desc:用来记录每个接口方法的执行时间
 */
public class MethodTimeAdvice implements MethodInterceptor {

    @Override
    public Object invoke(MethodInvocation invocation) throws Throwable {
        Logger logger = LoggerFactory.getLogger(invocation.getThis().getClass());

        // 用 commons-lang 提供的 StopWatch 计时
        StopWatch clock = null;
        if (logger.isDebugEnabled()) {
            clock = new StopWatch();
            clock.start(); // 计时开始
        }

        Object result = invocation.proceed();
        if (!logger.isDebugEnabled())
            return result;

        clock.stop(); // 计时结束

        // 方法参数类型,转换成简单类型
        Class[] params = invocation.getMethod().getParameterTypes();
        String[] simpleParams = new String[params.length];
        for (int i = 0; i < params.length; i++) {
            simpleParams[i] = params[i].getSimpleName();
        }
        Object[] args = invocation.getArguments();

        logger.debug("Takes:" + clock.getTime() + " ms ["
                + invocation.getThis().getClass().getName() + "."
                + invocation.getMethod().getName() + "("
                + StringUtils.join(simpleParams, ",") + ")("
                + StringUtils.join(args, ",") + ")] ");
        return result;
    }

}

注意:在上面的类中,我们定义了日志的输出级别 !logger.isDebugEnabled(),这样我们就可以根据级别筛选 输出到单独的文件与系统其他日志分开。

然后我们需要在Spring配置文件中定义切入点


<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop.xsd
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"
       default-lazy-init="true">
    <aop:aspectj-autoproxy />
    <bean id="methodTimeAdvice" class="com.project.common.util.MethodTimeAdvice"/>
    <aop:config>
        
        <aop:advisor id="methodTimeLog" advice-ref="methodTimeAdvice"
                     pointcut="
                     (execution(* com.project.service.impl.*Service.*(..)))
                     or (execution(* com.project.controller.*Controller.*(..)))
                     "/>
    aop:config>
beans>

注意:pointcut的语法有时间再补上

然后,在logback.xml 或者 log4j.xml中我们需要配置日志输出

"timeAdvice" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="File" value="${user.home}/logs/timeAdvice.log" />
        <param name="Encoding" value="UTF-8" />
        <param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />
        "org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss,SSS}-[%p] %m      |[%c:%L][%t]%n" />
        
        <filter class="org.apache.log4j.varia.LevelRangeFilter">
            <param name="LevelMin" value="DEBUG" />
            <param name="LevelMax" value="DEBUG" />
        filter>
    
<logger name="com.project.service.impl">
        <level value="DEBUG">level>
        <appender-ref ref="timeAdvice" />
    logger>
    <logger name="com.project.controller">
        <level value="DEBUG">level>
        <appender-ref ref="timeAdvice" />
    logger>
OK,通过上面的配置就可以将时间监控日志输出到单独的日志文件中了,便于调试。

最后的最后,千万别忘了引入相应的jar包:aopalliance-1.0.jar,其他的视你项目引用而定,缺什么引入什么

你可能感兴趣的:(java)