引入项目依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
这里没有引用日志框架,使用的springboot的默认日志框架logback
日志配置
在application.yml文件中添加如下代码
logging:
#打印日志级别
level:
root: info
com.springbootexample.prictice.controller: trace
#日志输出文件位置及名称
file: logs/hello.log
目标文件
package com.springbootexample.practice.controller;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.slf4j.Logger;
@Controller
public class HelloController {
private Logger logger= LoggerFactory.getLogger(HelloController.class);
@ResponseBody
@RequestMapping("/hello")
public String hello(){
logger.info("我是HelloController下的hello方法,我要开始执行了");
logger.info("我是HelloController下的hello方法,我执行结束");
return "hello";
}
}
定义切面
@Aspect
@Component
public class WebLogAspect {
private Logger logger= LoggerFactory.getLogger(WebLogAspect.class);
@Pointcut("execution(public * com.springbootexample.practice.controller..*.*(..))")//切入点描述 这个是controller包的切入点
public void controllerLog(){}//签名,可以理解成这个切入点的一个名称
@Pointcut("execution(public * com.springbootexample.practice.testController..*.*(..))")//切入点描述,这个是testController包的切入点
public void testControllerLog(){}
@Before("controllerLog() || testControllerLog()") //在切入点的方法run之前的工作
public void logBeforeController(JoinPoint joinPoint) {
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();//这个RequestContextHolder是Springmvc提供来获得请求的东西
HttpServletRequest request = ((ServletRequestAttributes)requestAttributes).getRequest();
// 记录下请求内容
logger.info("################URL : " + request.getRequestURL().toString());
logger.info("################HTTP_METHOD : " + request.getMethod());
logger.info("################IP : " + request.getRemoteAddr());
logger.info("################THE ARGS OF THE CONTROLLER : " + Arrays.toString(joinPoint.getArgs()));
//下面这个getSignature().getDeclaringTypeName()是获取包+类名的 然后后面的joinPoint.getSignature.getName()获取了方法名
logger.info("################CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
logger.info("################TARGET: " + joinPoint.getTarget());//返回的是需要加强的目标类的对象
logger.info("################THIS: " + joinPoint.getThis());//返回的是经过加强后的代理类的对象
logger.warn("开始执行方法");
}
@After("controllerLog() || testControllerLog()") //在切入点的方法run之前的工作
public void logAfterController(JoinPoint joinPoint) {
//下面这个getSignature().getDeclaringTypeName()是获取包+类名的 然后后面的joinPoint.getSignature.getName()获取了方法名
logger.info("################CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
logger.info("################TARGET: " + joinPoint.getTarget());//返回的是需要加强的目标类的对象
logger.info("################THIS: " + joinPoint.getThis());//返回的是经过加强后的代理类的对象
logger.info("################Result : " + "结束");
}
}
运行结果