注解+Aspect 省时省力的管理好接口日志

2024-06-24 01:08

本文主要是介绍注解+Aspect 省时省力的管理好接口日志,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

背景

无论是对外提供的RPC接口,还是项目内的普通方法,我们都会有需要打印方法入参、出参的需求,方便在遇到问题时通过查看日志快速定位,我们也会需要对方法的执行时间进行打印 方便分析和调优。
比较笨的做法就是在每个需要打印日志的地方使用log.info对参数进行打印,在每个方法内部方法体前后获取系统时间 在最后打印时间差
但这种对方法自身业务逻辑没有什么意义的的代码 侵入性太强 编写时也浪费时间 所以我们可以通过注解+AOP的方法 对这些操作进行封装 基于注解的控制又方便随时随地的使用

怎么做

定义注解

package com.common.interceptor.annotation;import java.lang.annotation.*;/*** 方法执行的入参 出参 及 执行时间*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RunTimeAnnotation {
}

Aspect

我们使用Aspect进行切面开发
首先引用对应的pom依赖

 <dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.7.3</version></dependency>

定义切面类:
这里使用@Around定义环绕通知

package com.common.interceptor;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;@Aspect
@Component
public class RunTimeAspect {private static final Logger logger = LoggerFactory.getLogger(RunTimeAspect.class);@Around("@annotation(com.common.interceptor.annotation.RunTimeAnnotation)")public Object around(ProceedingJoinPoint joinPoint) throws Throwable{long startTime = System.currentTimeMillis();//接收到请求,记录请求内容MethodSignature signature = (MethodSignature) joinPoint.getSignature();//获取参数Object[] args = joinPoint.getArgs();//获取方法String methodName = signature.getDeclaringTypeName() + "." + signature.getName();Object obj = null;try {logger.info("{}方法执开始执行,入参{}",methodName,args);obj = joinPoint.proceed();long excuteTime = System.currentTimeMillis() - startTime;logger.info("{}方法执结束执行,耗时{}ms,入参{},返回值{}",methodName,excuteTime,args,obj);} catch (Exception throwable) {logger.error("{}方法执行异常{}",methodName,throwable);//异常要抛出去 否则会影响外部方法事务回滚throw throwable;}return obj;}
}

写好后,我们只需要在需要的地方加上@RunTimeAnnotation 注解就可以了

@RunTimeAnnotation
public void consumer(String message){//...
}

这篇关于注解+Aspect 省时省力的管理好接口日志的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1088764

相关文章

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

springboot自定义注解RateLimiter限流注解技术文档详解

《springboot自定义注解RateLimiter限流注解技术文档详解》文章介绍了限流技术的概念、作用及实现方式,通过SpringAOP拦截方法、缓存存储计数器,结合注解、枚举、异常类等核心组件,... 目录什么是限流系统架构核心组件详解1. 限流注解 (@RateLimiter)2. 限流类型枚举 (

在macOS上安装jenv管理JDK版本的详细步骤

《在macOS上安装jenv管理JDK版本的详细步骤》jEnv是一个命令行工具,正如它的官网所宣称的那样,它是来让你忘记怎么配置JAVA_HOME环境变量的神队友,:本文主要介绍在macOS上安装... 目录前言安装 jenv添加 JDK 版本到 jenv切换 JDK 版本总结前言China编程在开发 Java

Spring Boot Actuator应用监控与管理的详细步骤

《SpringBootActuator应用监控与管理的详细步骤》SpringBootActuator是SpringBoot的监控工具,提供健康检查、性能指标、日志管理等核心功能,支持自定义和扩展端... 目录一、 Spring Boot Actuator 概述二、 集成 Spring Boot Actuat

MySQL多实例管理如何在一台主机上运行多个mysql

《MySQL多实例管理如何在一台主机上运行多个mysql》文章详解了在Linux主机上通过二进制方式安装MySQL多实例的步骤,涵盖端口配置、数据目录准备、初始化与启动流程,以及排错方法,适用于构建读... 目录一、什么是mysql多实例二、二进制方式安装MySQL1.获取二进制代码包2.安装基础依赖3.清

Java中使用 @Builder 注解的简单示例

《Java中使用@Builder注解的简单示例》@Builder简化构建但存在复杂性,需配合其他注解,导致可变性、抽象类型处理难题,链式编程非最佳实践,适合长期对象,避免与@Data混用,改用@G... 目录一、案例二、不足之处大多数同学使用 @Builder 无非就是为了链式编程,然而 @Builder

spring中的@MapperScan注解属性解析

《spring中的@MapperScan注解属性解析》@MapperScan是Spring集成MyBatis时自动扫描Mapper接口的注解,简化配置并支持多数据源,通过属性控制扫描路径和过滤条件,利... 目录一、核心功能与作用二、注解属性解析三、底层实现原理四、使用场景与最佳实践五、注意事项与常见问题六

使用Python构建一个高效的日志处理系统

《使用Python构建一个高效的日志处理系统》这篇文章主要为大家详细讲解了如何使用Python开发一个专业的日志分析工具,能够自动化处理、分析和可视化各类日志文件,大幅提升运维效率,需要的可以了解下... 目录环境准备工具功能概述完整代码实现代码深度解析1. 类设计与初始化2. 日志解析核心逻辑3. 文件处

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控