下面是详细讲解“spring-boot使用AOP统一处理日志”的完整攻略。
什么是AOP?
AOP(Aspect Oriented Programming),中文翻译为面向切面编程,它允许我们通过预编译方式和运行期动态代理实现程序功能的统一维护。
AOP常见的应用场景
AOP的应用场景非常多,最常见的包括:日志记录、权限控制、事务管理、性能统计、异常处理等。
spring-boot使用AOP统一处理日志的步骤
下面我们以Spring Boot为例,讲解如何使用AOP统一处理日志。
Step1: 添加依赖
在pom文件中添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
该依赖为AOP的核心依赖。
Step2: 创建注解
我们需要创建一个注解,用于标记需要记录日志的方法。代码如下:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Log {
String value() default "";
}
该注解包含一个value属性,可以用于记录操作名称等信息。
Step3: 编写切面
我们需要编写一个切面类,用于拦截被Log注解标记的方法并记录日志。代码如下:
@Component
@Aspect
public class LogAspect {
private final Logger logger = LoggerFactory.getLogger(LogAspect.class);
@Around(value = "@annotation(log)")
public Object around(ProceedingJoinPoint joinPoint, Log log) throws Throwable {
Object result;
try {
result = joinPoint.proceed();
logger.info("【{}]方法执行成功!", log.value());
return result;
} catch (Exception e) {
logger.error("【{}]方法执行出错:{}", log.value(), e.getMessage());
throw e;
}
}
}
该切面类包含一个around方法,用于拦截Log注解标记的方法。在方法执行前和执行后分别记录日志信息。
Step4: 测试
我们创建一个测试控制器,包含一个被Log注解标记的方法。然后启动应用程序并调用该方法,查看控制台是否记录了日志信息。代码如下:
@RestController
public class TestController {
@Log(value = "测试方法")
@GetMapping("/test")
public String test() {
return "Hello World!";
}
}
测试结果如下:
2019-09-19 13:55:56.751 [http-nio-8080-exec-2] INFO c.g.o.l.a.LogAspect - 【测试方法】方法执行成功!
日志信息被成功记录。
示例2:记录请求信息
我们可以使用AOP拦截请求,记录请求信息并统计请求耗时。
Step1: 添加依赖
在pom文件中添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
该依赖包含Web开发所需的组件。
Step2: 创建注解
我们需要创建一个注解,用于标记需要记录请求信息的方法。代码如下:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface RequestLog {
}
该注解为空,不包含任何属性。
Step3: 编写切面
我们需要编写一个切面类,用于拦截被RequestLog注解标记的方法并记录请求信息。代码如下:
@Component
@Aspect
public class RequestLogAspect {
private final Logger logger = LoggerFactory.getLogger(RequestLogAspect.class);
ThreadLocal<Long> startTime = new ThreadLocal<>();
@Autowired
private HttpServletRequest request;
@Autowired
private HttpServletResponse response;
@Around(value = "@annotation(requestLog)")
public Object around(ProceedingJoinPoint joinPoint, RequestLog requestLog) throws Throwable {
startTime.set(System.currentTimeMillis());
String url = request.getRequestURI();
String method = request.getMethod();
Object result = joinPoint.proceed();
long endTime = System.currentTimeMillis();
logger.info("【请求信息】URL: {},Method: {},耗时:{}ms", url, method, (endTime - startTime.get()));
startTime.remove();
return result;
}
}
该切面类包含一个around方法,用于拦截RequestLog注解标记的方法。在方法执行前记录请求信息,并在方法执行后记录请求耗时。
Step4: 测试
我们创建一个测试控制器,包含一个被RequestLog注解标记的方法。然后启动应用程序并调用该方法,查看控制台是否记录了请求信息。代码如下:
@RestController
public class TestController {
@RequestLog
@GetMapping("/test")
public String test() {
return "Hello World!";
}
}
测试结果如下:
2019-09-19 14:14:56.663 [http-nio-8080-exec-2] INFO c.g.o.l.a.RequestLogAspect - 【请求信息】URL: /test,Method: GET,耗时:13ms
请求信息被成功记录。
到此为止,就完成了使用AOP统一处理日志的攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:spring-boot使用AOP统一处理日志 - Python技术站