日志系列---【SpringBoot使用Aop实现格式化日志】
1.最终实现效果
2.在pom中引入Aop依赖(可以先写个@Aspect注解,如果不报错,说明项目中引入过aop依赖了,不用再重复引入下面的依赖)
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
3.这里我项目中用了swagger,为了不重复写注释,我直接用了@ApiOperation注解作为切点,当然,也可以自定义注解,把ApiOperation换成自定义的就行了。
package com.system.annotation.Handler; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.aspectj.lang.reflect.MethodSignature; 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.lang.reflect.Method; @Slf4j @Aspect @Component public class LogHandler { @Pointcut("@annotation(io.swagger.annotations.ApiOperation)") public void webLog() { } @Around("webLog()") public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { long startTime = System.currentTimeMillis(); Object result = proceedingJoinPoint.proceed(); //打印出参 log.info("Response Args : {}", result); //执行耗时 log.info("exe-time : {} ms", System.currentTimeMillis() - startTime); log.info("============================================End==================================================="+System.lineSeparator()); return result; } @Before("webLog()") public void doBefore(JoinPoint joinPoint){ ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature(); Method method = methodSignature.getMethod(); ApiOperation annotation = method.getAnnotation(ApiOperation.class); String msg = annotation.value(); log.info(System.lineSeparator()); log.info("============================================Start================================================="); //打印请求的url log.info("URL : {}",request.getRequestURL().toString()); log.info("Description : {}",msg); log.info("HTTP Method : {}",request.getMethod()); log.info("Class Method : {},{}",joinPoint.getSignature().getDeclaringTypeName(),joinPoint.getSignature().getName()); log.info("IP : {}",request.getRemoteAddr()); Object[] args = joinPoint.getArgs(); log.info("Request Args : {}",args); } @After("webLog()") public void doAfter() throws Throwable{ log.info("==========================================Response================================================="); } }
4.自定义注解(可以不自定义,我直接用的ApiOperation)
package com.jiulong.springboot_validator.annotation; import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD}) @Documented public @interface WebLog { /** * 日志描述信息 * * @return String */ String value() default ""; }
愿你走出半生,归来仍是少年!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?