AspectWebLog 访问Controller时会有相关日志打印

需要引入以下包

        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.6.11</version>
        </dependency>

 

主要打印 元素有

1、controller名

2、方法名

3、HTTP方法类型 post or get

4、sessionId

5、session存活时长 

6、方法执行完成时间

7、ip地址

import com.google.gson.Gson;
import org.apache.catalina.session.StandardSessionFacade;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Web层日志切面
 */
@Aspect
@Order(5)
@Component
public class AspectWebLog {

    private Logger logger = LoggerFactory.getLogger(getClass());
    SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    ThreadLocal<Long> startTime = new ThreadLocal<>();

    /**
     *     匹配controller包及其子包下所有类的方法  
     * @info 2019-10-17 09:54 liuxi
     *
     */

    @Pointcut("within(com.mmall.controller..*)")
    public void webLog() {}

    @Before("webLog()")
    public void doBefore(JoinPoint joinPoint) throws Throwable {
        startTime.set(System.currentTimeMillis());

        // 接收到请求,记录请求内容
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();

        // 记录下请求内容
        logger.info("\n");
        logger.info("CLASS_METHOD        : " + joinPoint.getSignature().getDeclaringTypeName());
        logger.info("URI                 : " + request.getRequestURI());
        logger.info("HTTP_METHOD         : " + request.getMethod());
        Gson gson = new Gson();
        for (int i = 0; i < joinPoint.getArgs().length; i++) {
            if (!(joinPoint.getArgs()[i] instanceof String)) {
                if (joinPoint.getArgs()[i] != null && joinPoint instanceof StandardSessionFacade) {
                    StandardSessionFacade standardSessionFacade = ((StandardSessionFacade) joinPoint.getArgs()[i]);

                    logger.info("ARGS   SessionId    : " + standardSessionFacade.getId());
                    logger.info("ARGS   MaxTime      : " + standardSessionFacade.getMaxInactiveInterval());
                    logger.info("ARGS   AccessedTime : " + s.format(new Date(standardSessionFacade.getLastAccessedTime())));
                }
            } else {
                logger.info("ARGS                : " + joinPoint.getArgs()[i]);
            }
        }
        logger.info("IP                  : " + request.getRemoteAddr());
    }

    @AfterReturning(returning = "ret", pointcut = "webLog()")
    public void doAfterReturning(Object ret) throws Throwable {
        // 处理完请求,返回内容
        logger.info("RESPONSE : " + ret);
        logger.info("SPEND TIME : " + (System.currentTimeMillis() - startTime.get()));
    }
}

 

posted on 2019-10-17 10:10  刘相如  阅读(287)  评论(0)    收藏  举报