spring提供了aop方式的日志系统,springmvc aop实现日志管理
目录
前言实现1、引入依赖2、定义回溯配置3、编写切面类4、测试
前言
请问今天您便秘了吗?程序员坐久了真的会便秘哦,如果偶然点进了这篇小干货,就麻烦您喝杯水然后去趟厕所一边用左手托起对准嘘嘘,一边用右手滑动手机看完本篇吧。
实现
本篇面向切面编程统一日志管理写法来源于国外知名开源框架吉普斯特的面向切面编程日志管理方式
1、引入依赖
!-春季aop -依赖groupIdorg.springframework.boot/groupId artifact id spring-boot-starter-AOP/artifact id/依赖项
2、定义logback配置
1)开发、测试环境的弹簧网包定义日志级别为信息,项目包定义日志级别为调试;
2)产品环境的弹簧网包定义日志级别为错误,项目包定义日志级别为信息;
?可扩展标记语言版本=1.0 编码=UTF八号?配置包括resource= org/spring framework/boot/logging/log back/base。XML /logger name= org。spring框架。web level= INFO /logger name= org。弹簧靴。sample level= TRACE /spring profile name= dev,test logger name= org。spring框架。web level= INFO /logger name= org。弹簧靴。sample level= INFO /logger name= com。举例。 AOP log level= DEBUG //spring profile spring profile name= prod
3、编写切面类
1)springBeanPointcut():单独定义的弹簧框架切入点;
2)应用包切入点():单独定义的项目包切入点;
3)logAfterThrowing():1和注射毒品定义的切入点抛出异常时日志格式及显示内容;
4)logAround():1和注射毒品定义的切入点方法进入和退出时日志格式及显示内容。
包com。举例。AOP日志。伐木;导入com。举例。AOP日志。常数。全球常数;导入org。AspectJ。郎。连接点;导入org。AspectJ。郎。proceedingjoinpoint导入org。AspectJ。郎。注释。投掷后;导入org。AspectJ。郎。注释。周围;导入org。AspectJ。郎。注释。方面;导入org。AspectJ。郎。注释。切入点;导入org。slf4j。记录者;导入org。SLF 4j。伐木工厂;导入org。spring框架。核心。环境。环境;导入org.spri
ngframework.core.env.Profiles;import org.springframework.stereotype.Component;import java.util.Arrays;/** * <p> * AOP统一日志管理 切面类 * </p> * * @author 福隆苑居士,公众号:【Java分享客栈】 * @since 2022/5/5 21:57 */@Aspect@Componentpublic class LoggingAspect { private final Logger log = LoggerFactory.getLogger(this.getClass()); private final Environment env; public LoggingAspect(Environment env) { this.env = env; } /** * 匹配spring框架的repositories、service、rest端点的切面 */ @Pointcut("within(@org.springframework.stereotype.Repository *)" + " within(@org.springframework.stereotype.Service *)" + " within(@org.springframework.web.bind.annotation.RestController *)") public void springBeanPointcut() { // 方法为空,因为这只是一个切入点,实现在通知中。 } /** * 匹配我们自己项目的repositories、service、rest端点的切面 */ @Pointcut("within(com.example.aoplog.repository..*)"+ " within(com.example.aoplog.service..*)"+ " within(com.example.aoplog.controller..*)") public void applicationPackagePointcut() { // 方法为空,因为这只是一个切入点,实现在通知中。 } /** * 记录方法抛出异常的通知 * * @param joinPoint join point for advice * @param e exception */ @AfterThrowing(pointcut = "applicationPackagePointcut() && springBeanPointcut()", throwing = "e") public void logAfterThrowing(JoinPoint joinPoint, Throwable e) { // 判断环境,dev、test or prod if (env.acceptsProfiles(Profiles.of(GloablConstants.SPRING_PROFILE_DEVELOPMENT, GloablConstants.SPRING_PROFILE_TEST))) { log.error("Exception in {}.{}() with cause = {} and exception = {}", joinPoint.getSignature().getDeclaringTypeName(), joinPoint.getSignature().getName(), e.getCause() != null? e.getCause() : "NULL", e.getMessage(), e); } else { log.error("Exception in {}.{}() with cause = {}", joinPoint.getSignature().getDeclaringTypeName(), joinPoint.getSignature().getName(), e.getCause() != null? e.getCause() : "NULL"); } } /** * 在方法进入和退出时记录日志的通知 * * @param joinPoint join point for advice * @return result * @throws Throwable throws IllegalArgumentException */ @Around("applicationPackagePointcut() && springBeanPointcut()") public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable { if (log.isDebugEnabled()) { log.debug("Enter: {}.{}() with argument[s] = {}", joinPoint.getSignature().getDeclaringTypeName(), joinPoint.getSignature().getName(), Arrays.toString(joinPoint.getArgs())); } try { Object result = joinPoint.proceed(); if (log.isDebugEnabled()) { log.debug("Exit: {}.{}() with result = {}", joinPoint.getSignature().getDeclaringTypeName(), joinPoint.getSignature().getName(), result); } return result; } catch (IllegalArgumentException e) { log.error("Illegal argument: {} in {}.{}()", Arrays.toString(joinPoint.getArgs()), joinPoint.getSignature().getDeclaringTypeName(), joinPoint.getSignature().getName()); throw e; } }}
4、测试
1)写个service
package com.example.aoplog.service;import lombok.extern.slf4j.Slf4j;import org.springframework.stereotype.Service;/** * <p> * AOP统一日志管理测试服务 * </p> * * @author 福隆苑居士,公众号:【Java分享客栈】 * @since 2022/5/5 21:57 */@Service@Slf4jpublic class AopLogService { public String test(Integer id) { return "传入的参数是:" + id; }}
2)写个controller
package com.example.aoplog.controller;import com.example.aoplog.service.AopLogService;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.http.ResponseEntity;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;/** * <p> * 测试接口 * </p> * * @author 福隆苑居士,公众号:【Java分享客栈】 * @since 2022/4/30 11:43 */@RestController@RequestMapping("/api")@Slf4jpublic class TestController { private final AopLogService aopLogService; public TestController(AopLogService aopLogService) { this.aopLogService = aopLogService; } @GetMapping("/test/{id}") public ResponseEntity<String> test(@PathVariable("id") Integer id) { return ResponseEntity.ok().body(aopLogService.test(id)); }}
3)设置环境
这里我试试dev,prod自己试听见没?不服一拳打哭你哦!
server: port: 8888# 环境:dev-开发 test-测试 prod-生产spring: profiles: active: dev
4)效果
不解释了自己看
试试异常情况,手动加个异常。
@Service@Slf4jpublic class AopLogService { public String test(Integer id) { int i = 1/0; return "传入的参数是:" + id; }}
效果
到此这篇关于SpringBoot使用AOP统一日志管理的方法详解的文章就介绍到这了,更多相关SpringBoot AOP日志管理内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。