简介:
System.out.println("…")、log.info("…")是不是看起来很亲切,在每个方法中使用上述两种方式获取日志,在大项目大公司是是绝对不允许的。正确的做法是使用统一日志管理,即在每个请求前后根据业务需要对数据进行日志记录,可以使用拦截器、过滤器、切片,本章将介绍AOP的方式。
统一日志管理:
1、pom依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2、新建切面类:
/**
* @Auther: xf
* @Date: 2018/11/23 21:38
* @Description: AOP 统一日志切面类
*/
@Slf4j
// 表示这是一个切面类
@Aspect
// 将此类交给spring容器管理
@Component
public class LogAspect {
// 切入点 即 aop 切入的路径(被拦截的方法)
@Pointcut("execution(public * com.coolron.*.controller..*.*(..))")
public void aspectPoint() {
}
/**
* 前置通知
*/
// 指定切入点 与上面定义的一样
@Before("aspectPoint()")
public void LogRequestInfo(JoinPoint joinPoint) throws Exception {
// 执行controller 方法之前需要记录的请求信息
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
log.info("URL: {}",request.getRequestURL());
log.info("HTTP_METHOD: {} ", request.getMethod());
log.info("IP: {}", request.getRemoteAddr());
log.info("CLASS_METHOD: {}", joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
log.info("ARGS: {}", Arrays.toString(joinPoint.getArgs()));
}
/**
* 后置通知
*/
@AfterReturning(returning = "apiResult", pointcut = "aspectPoint()")
public void logResultVOInfo(ApiResult apiResult) throws Exception {
log.info("请求结果:" + apiResult.getStatus() + "\t" + apiResult.getMsg());
}
}
2、userController(使用之前的代码):
@RestController
@RequestMapping(value = "user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping(value="getUser/{id}", method=RequestMethod.GET)
public ApiResult getUser(@PathVariable Integer id) {
User user = userService.getUser(id);
return ApiResult.ok(user);
}
}
3、测试:
请求用户接口:http://127.0.0.1:8080/user/getUser/2
可以看到日志信息记录成功,请求其他被切入点管理的接口同样可以记录日志信息。
联系我:
QQ:1421925880
相关springboot、springcloud、docker等文章关注微信公众号: