SpringBoot:整合日志(使用AOP统一处理WEB端传参)

一,日志整合

    SpringBoot对log4j日志和spring-aop进行了内置整合处理,通过maven坐标引入及切点配置,实现日志处理及AOP整合

二,Maven坐标依赖

<!-- log4j -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-log4j</artifactId>
</dependency>
<!-- aop -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!-- fastJson -->
<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>fastjson</artifactId>
	<version>1.2.32</version>
</dependency>

三,log4j.properties

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=E:/mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### set log levels - for more verbose logging change 'info' to 'debug' ###

log4j.rootLogger=info, error, stdout

四,业务方法

package com.gupao.springboot.test.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author pj_zhang
 * @create 2018-12-23 23:06
 **/
@RestController
public class ErrorController {

    private Logger logger = LoggerFactory.getLogger(ErrorController.class);

    @RequestMapping("/calculate")
    public String calculate(int i) {
        int j = 6 / i;
        logger.info(String.valueOf(j));
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return String.valueOf(j);
    }
}

五,拦截器

package com.gupao.springboot.test.aspect;

import com.alibaba.fastjson.JSONObject;
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.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;

/**
 * @author pj_zhang
 * @create 2018-12-24 19:49
 **/
// 声明一个切面
@Aspect
// 被Spring进行管理
@Component
public class WebLogAspect {

    private Logger logger = LoggerFactory.getLogger(WebLogAspect.class);

    private ThreadLocal<Long> time = new ThreadLocal<>();

    // 声明一个切点, value为拦截表达式, 表示拦截controller包下所有方法
    @Pointcut("execution(public * com.gupao.springboot.*.controller.*.*(..))")
    public void webLog() {
    }

    // 前置拦截器
    // value表示切点, 值为声明切点的方法名称
    @Before("webLog()")
    public void webLogBefore(JoinPoint joinPoint) {
        time.set(System.currentTimeMillis());
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = requestAttributes.getRequest();
        logger.info("request url : " + request.getRequestURL().toString());
        logger.info("request host : " + request.getRemoteHost());
        logger.info("request address : " + request.getRemoteAddr());
        logger.info("request methods : " + joinPoint.getSignature());
        Enumeration<String> parameters = request.getParameterNames();
        while (parameters.hasMoreElements()) {
            String name = parameters.nextElement();
            logger.info("request param : {}, value : {}", name, request.getParameter(name));
        }
    }

    // 后置拦截器
    // returning表示返回对象
    // pointcut表示定义切点的方法名
    @AfterReturning(returning = "obj", pointcut = "webLog()")
    public void webLogReturning(Object obj) {
        // 通过fastJson转换返回的数据
        logger.info("return object : " + JSONObject.toJSONString(obj));
        logger.info("cost time : " + (System.currentTimeMillis() - time.get()));
    }

}

    * 切点定义方式可以通过引用来进行定义,如下;多个引用可以用“||”进行隔开引用

@Pointcut("execution(public * com.gupao.springboot.*.controller.*.*(..))")
public void webLog() {
}

@Pointcut("webLog()")
public void reference() {
}

六,执行结果

猜你喜欢

转载自blog.csdn.net/u011976388/article/details/85239029