日志系列---【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 ""; }
愿你走出半生,归来仍是少年!