前言
在我们日常的开发过程中通过打印详细的日志信息能够帮助我们很好地去发现开发过程中可能出现的Bug,特别是在开发Controller层的接口时,我们一般会打印出Request请求参数和Response响应结果,但是如果这些打印日志的代码相对而言还是比较重复的,那么我们可以通过什么样的方式来简化日志打印的代码呢?
SpringBoot 通过自定义注解实现权限检查可参考我的博客:SpringBoot 通过自定义注解实现权限检查
正文
Spring AOP
Spring AOP 即面向切面,是对OOP面向对象的一种延伸。
AOP机制可以让开发者把业务流程中的通用功能抽取出来,单独编写功能代码。在业务流程执行过程中,Spring框架会根据业务流程要求,自动把独立编写的功能代码切入到流程的合适位置。
我们通过AOP机制可以实现:Authentication 权限检查、Caching 缓存、Context passing 内容传递、Error handling 错误处理、日志打印等功能,这里我们讲一下怎么用Spring AOP来实现日志打印。
SpringBoot通过自定义注解实现日志打印
Maven依赖
<!--lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.2</version> <optional>true</optional> </dependency> <!--Spring AOP--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
ControllerMethodLog.class自定义注解
/** * 自定义注解用于打印Controller层方式日志 */ @Documented @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD}) public @interface ControllerMethodLog { }
这里特别讲一下@Retention,按生命周期来划分可分为3类:
这3个生命周期分别对应于:Java源文件(.java文件) —> .class文件 —> 内存中的字节码。
Spring AOP切面方法的执行顺序
这里简单介绍一下,切面的执行方法和其执行顺序:
这里以一个返回正常的情况为例:(异常替换最后一步即可)
ControllerMethodLogAspect.class:用于打印日志的切面定义类
注意要在启动类扫描这个class,并且添加 @EnableAspectJAutoProxy(proxyTargetClass = true)
@Slf4j @Component @Aspect public class ControllerMethodLogAspect { @Pointcut("@annotation(com.xiyuan.demo.annotation.ControllerMethodLog)") public void pointCut() { } /** * 在切点运行前执行该方法 */ @Before("pointCut()") public void doBefore(JoinPoint joinPoint) { MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod(); ControllerMethodLog annotation = method.getAnnotation(ControllerMethodLog.class); if (Objects.isNull(annotation)) { return; } String methodName = method.getDeclaringClass().getSimpleName() + "." + method.getName(); log.info("start {}:入参:{}", methodName, JSON.toJSONString(joinPoint.getArgs())); } /** * 在切点运行后,无异常时执行该方法 * * @param joinPoint * @param result */ @AfterReturning(value = "pointCut()", returning = "result") public void afterReturn(JoinPoint joinPoint, Object result) { MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod(); ControllerMethodLog annotation = method.getAnnotation(ControllerMethodLog.class); if (Objects.isNull(annotation)) { return; } String methodName = method.getDeclaringClass().getSimpleName() + "." + method.getName(); log.info("end {}:响应:{}", methodName, JSON.toJSONString(result)); } }
验证
getUserById:根据id获取用户的信息
@GetMapping("/getUserById") @ApiOperation(value = "根据用户id获取用户") @ControllerMethodLog public ResponseResult getUserById(@RequestParam(name = "id", required = true) String id) { UserInfoPojo userInfoPojo = userService.getUserById(id); return ResponseResult.success(userInfoPojo, ConstantsUtil.QUERY_SUCCESS); }
Swagger接口信息如下:
IDEA控制台打印信息如下:
总结
到此这篇关于Spring Boot如何通过自定义注解实现日志打印的文章就介绍到这了,更多相关SpringBoot自定义注解实现日志打印内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!
本文向大家介绍SpringBoot如何通过自定义注解实现权限检查详解,包括了SpringBoot如何通过自定义注解实现权限检查详解的使用技巧和注意事项,需要的朋友参考一下 前言 最近开发了一个接口,完成后准备自测时,却被拦截器拦截了,提示:(AUTH-NO)未能获得有效的请求参数!怎么会这样呢? 于是我全局搜了这个提示语,结果发现它被出现在一个Aspect类当中了,并且把一个 @interface
本文向大家介绍Flutter实战之自定义日志打印组件详解,包括了Flutter实战之自定义日志打印组件详解的使用技巧和注意事项,需要的朋友参考一下 在Flutter中,如果我们需要打印日志,如果不进行自定义,我们只能使用自带的 print() 或者 debugPrint() 方法进行打印,但是这两种打印,日志都是默认 Info 层级的日志,很不友好,所以如果需要日志打印层级分明,我们就需要自定义一
当前logback.xml 当前结果: 我想要结果:
本文向大家介绍SpringBoot Jpa 自定义查询实现代码详解,包括了SpringBoot Jpa 自定义查询实现代码详解的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了SpringBoot Jpa 自定义查询实现代码详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 持久层Domain 控制器写法 以上就是本文的全部内容,希望对
本文向大家介绍spring AOP自定义注解方式实现日志管理的实例讲解,包括了spring AOP自定义注解方式实现日志管理的实例讲解的使用技巧和注意事项,需要的朋友参考一下 今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理。废话不多说,直接开始!!! 关于配置我还是的再说一遍。 在applicationContex
本文向大家介绍springMVC自定义注解,用AOP来实现日志记录的方法,包括了springMVC自定义注解,用AOP来实现日志记录的方法的使用技巧和注意事项,需要的朋友参考一下 需求背景 最近的一个项目,在项目基本完工的阶段,客户提出要将所有业务操作的日志记录到数据库中,并且要提取一些业务的关键信息(比如交易单号)体现在日志中。 为了保证工期,在查阅了资料以后,决定用AOP+自定义注解的方式来完