SpringBoot使用AOP配置Log4j日志切面
首先、最主要的,配置文件:application.yml和pom.xml得加上这几条配置
#定义日志文件路径 logging: file: logs/all.log
<!--aop--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
具体配置的切面类:
package top.yibobo.hospital.controller;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
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.util.Arrays;
@Aspect
@Component
@Order(3)//Order用来定义切面执行顺序
public class WebLogAspect {
//定义日志记录器
Logger logger = LoggerFactory.getLogger(this.getClass());
ThreadLocal<Long> startTime = new ThreadLocal<>();//线程备份类,用来记录时间
@Pointcut("execution(public * top.yibobo.hospital.controller.*.*(..))")
public void weblog(){}
@Before("weblog()")
public void dobefore(JoinPoint joinPoint){
logger.info("前置通知:");
//方法执行前的系统当前时间
startTime.set(System.currentTimeMillis());
//由于切面类不能从方法入参注入、所以只能这样获取servlet请求对象
ServletRequestAttributes attributes = (ServletRequestAttributes)
RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
//让日志记录请求相关信息
logger.info("URL:"+request.getRequestURL().toString());
logger.info("METHOD:"+request.getMethod());
logger.info("CLASS_METHOD:"+joinPoint.getSignature().getDeclaringTypeName()
+"."+joinPoint.getSignature().getName());
logger.info("ARGS:"+ Arrays.toString(joinPoint.getArgs()));
}
@AfterReturning(returning = "ret",pointcut = "weblog()")//返回值注入给ret
public void doafter(Object ret){
logger.info("后置通知:");
logger.info("RESPONSE:"+ret);
logger.info("SPEND:"+(System.currentTimeMillis()-startTime.get())+"MS");
}
}
