使用Spring AOP实现对外接口的日志自动打印

文章目录

    • 一、引言
    • 二、使用AOP实现日志打印
    • 三、logback单独打印api调用信息

一、引言

相信我们都有过这样的经历,在提供第三方对外接口时,为了防止推诿扯皮,我们会在自己接口被调用时日志打印一下第三方的调用参数,再在业务逻辑结束返回时再打印一下给第三方的返回参数,这样在后续遇到bug时,能用日志方便排(shuai)查(guo)。
如果老老实实的手动打印日志,我们的代码将会是这个样子

publish Response queryTask(RequestParam param) {// 打印第三方请求参数LOGGER.info("queryTask param:{}", JSON.toJSONString(param));// Response为执行查询业务后的结果Response rsp = null;// 打印返回给第三方的结果LOGGER.info("queryTask response:{}", JSON.toJSONString(rsp))return rsp;
}

每个接口都这样去写,又麻烦又怕自己忘记,如此机械化的简单行为,有没有什么办法能够让程序帮我们做这份工作?让我们的代码变得更加优雅呢?Spring的AOP是一个不错的思想。

二、使用AOP实现日志打印

  1. 定义一个api注解,它所标注的方法均能够打印入参和返回
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ApiLog {}
  1. 定义我们的切面和切点
@Component
@Aspect
public class ApiLogAspect {// 切入点@Pointcut("@annotation(com.yangyungang.open.aspect.log.anno.ApiLog)")private void apiLogPointCut() {}// 环绕通知@Around("apiLogPointCut()")public Object around(ProceedingJoinPoint joinPoint) throws Throwable {MethodSignature signature = (MethodSignature) joinPoint.getSignature();// 类名String className = joinPoint.getTarget().getClass().getName();// 方法名String methodName = signature.getName();// 参数Object[] args = joinPoint.getArgs();StringBuffer requestInfo = new StringBuffer();requestInfo.append("the api method (").append(className).append(":").append(methodName).append(") called, request param: ");if (AdaptorCommonUtil.checkSafe(args)) {Arrays.stream(args).forEach(p -> requestInfo.append(JSON.toJSONString(p)).append(" "));}// 在方法执行前打印LOGGER.info(requestInfo.toString());// 执行方法Object result = joinPoint.proceed();// 在方法执行后打印LOGGER.info("the api ({}:{}) method return:{}", className, methodName, JSON.toJSONString(result));return result;}
}

ApiLogAspect这个类为一个切面,@Pointcut代表切入点,这里我的注解ApiLog就为切入点,@Around(“apiLogPointCut()”)代表在切入点附近进行环绕通知,也就是要执行我们前面说的日志打印,我们在方法执行前后都进行了拦截,进行日志打印,joinPoint.proceed()才真正执行我们的业务逻辑。
写好该切面后,我们要做的仅仅只是在api方法上加入注解就可以了

@ApiLog
publish Response queryTask(RequestParam param) {// Response为执行查询业务后的结果Response rsp = null;return rsp;
}

所达到的效果和“引言”中的代码块一致。

三、logback单独打印api调用信息

当我写好接口后,又发现api调用日志和我们的业务日志完全糅杂在了一起,即使将来排查,也难以进行区分,由于我们项目使用的是logback,可以让我们的api包(通常第三方api会单独写到一个包里)单独打印到一个日志文件中,这样日志不就很清爽了吗,只需要改一下logback的配置文件即可

<!-- api调用的日志单独打印 --><logger name="com.yangyungang.open.aspect.log.aop.ApiLogAspect" level="INFO" additivity="false"><appender-ref ref="OPENAPI" /><appender-ref ref="STDOUT" /></logger><!-- api日志Appender --><appender name="OPENAPI" class="ch.qos.logback.core.rolling.RollingFileAppender"><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>INFO</level></filter><File>${LOG_HOME}/${COMPONENT_ID}.${SEGMENT_ID}.openApi.debug.log</File><rollingPolicy class="logback.rolling.log.gather.TimeBasedBackUpRollingPolicy"><FileNamePattern>${LOG_HOME}/${COMPONENT_ID}.${SEGMENT_ID}.openApi.debug.log.%i.zip</FileNamePattern><MinIndex>1</MinIndex><!--最多十个文件 --><MaxIndex>${log.max.index}</MaxIndex></rollingPolicy><triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"><MaxFileSize>${log.openApi.max.size}</MaxFileSize></triggeringPolicy><encoder><pattern>${FILE_LOG_PATTERN}</pattern><charset>${log.charset}</charset></encoder></appender>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/672637.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构第十一天(栈)

目录 前言 概述 源码&#xff1a; 主函数&#xff1a; 运行结果&#xff1a; ​编辑 前言 今天简单的实现了栈&#xff0c;主要还是指针操作&#xff0c;soeasy! 友友们如果想存储其他内容&#xff0c;只需修改结构体中的内容即可。 哈哈&#xff0c;要是感觉不错&…

[React] ref属性

简介 ref 即 reference &#xff0c;是 React 提供给我们的安全访问 DOM 元素或者某个组件实例的句柄。 组件被调用时会新建一个该组件的实例&#xff0c;而 ref 就会指向这个实例。它可以是一个回调函数&#xff0c;这个回调函数会在组件被挂载后立即执行。 为了防止内存泄漏…

数论 之 欧拉函数篇

欧拉函数 定义&#xff1a;1 ∼ N 中与 N 互质的数的个数被称为欧拉函数&#xff0c;记为 ϕ(N) 公式&#xff1a;若 N p1^a1 * p2^a2 * … * pk^ak 所有的pi都是N的质因数 那么 ϕ(N) N * (p1-1)/p1 * (p2-1)/p2 * … *(pk-1)/pk; 性质 : 性质1&#xff1a;如果n是质数&…

【C生万物】C语言分支和循环语句

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;小杨水平有…

京东云StarDB for openGauss实现混合多云场景元数据安全可控

推进产业数字化&#xff0c;构筑数智供应链技术底座&#xff0c;绕不开全球信息技术基础三大件之一的数据库。以技术创新为手段&#xff0c;以满足未来业务需求为目标&#xff0c;京东云自主研发的分布式数据库StarDB在长期的业务实践过程中不断进化&#xff0c;在海量且复杂的…

深入理解网络编程之BIO和NIO

目录 原生JDK网络编程BIO BIO通信模型服务端代码 BIO通信模型客户端代码 伪异步模型服务端代码&#xff08;客户端跟之前一致&#xff09; 原生JDK网络编程NIO 什么是NIO&#xff1f; NIO和BIO的主要区别 阻塞与非阻塞IO NIO之Reactor模式 NIO中Reactor模式的基本组成…

零基础学Python之网络编程

1.什么是socket 官方定义&#xff1a; 套接字&#xff08;socket&#xff09;是一个抽象层&#xff0c;应用程序可以通过它发送或接收数据&#xff0c;可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中&#xff0c;并与网络中的其他应用…

ChatGPT论文指南|ChatGPT论文写作过程中6个润色与查重提示词

论文完成初稿之后&#xff0c;一般情况下&#xff0c;宝子们还需要找专家给我们提出评审意见。找专家评审其实并不容易&#xff0c;即使对老师来说&#xff0c;找人评审论文也是一件苦活。我们这个时候可以通过文字提示让 ChatGPT充当我们的评审专家&#xff0c;为论文提出问题…

Json hijacking/Json 劫持注入漏洞原理以及修复方法

漏洞名称&#xff1a;Json hijacking 、Json劫持漏洞、Json注入攻击 漏洞描述&#xff1a; JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成&#xff0c;这种纯文本的数据交互方式由于可以天然的在浏览器中使用&a…

开源软件的未来发展趋势与应对新挑战和机遇

引言 开源软件&#xff0c;以其透明性、可协作性和成本效益&#xff0c;不仅仅是一种编写和分发软件的模式&#xff0c;更是一场日益扩展的技术革命。随着越来越多企业和个人用户认识到其潜在价值&#xff0c;我们有理由相信开源将继续推动软件行业的未来变革。本篇博文旨在预…

【操作系统·考研】I/O管理概述

1.I/O设备 1.1 块设备 信息交换以数据块为单位&#xff0c;它属于有结构设备。 块设备传输速率较高&#xff0c;可寻址&#xff0c;且可对该设备随机地的读写。 栗子&#x1f330;&#xff1a;磁盘。 1.2 字符设备 信息交换以字符为单位&#xff0c;属于无结构类型。 字符…

电力负荷预测 | 基于LSTM、TCN的电力负荷预测(Python)

文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 电力负荷预测 | 基于LSTM、TCN的电力负荷预测(Python) 源码设计 #------------------

一文彻底搞懂Redis的三种集群模式

文章目录 1. 主从模式1.1 基本原理1.2 工作机制1.3 优缺点 2. 哨兵模式2.1 基本原理2.2 工作机制2.3 优缺点 3. 集群模式3.1 基本原理3.2 工作机制3.3 优缺点 4. 总结 redis高可用的三种模式&#xff1a;主从模式&#xff0c;哨兵模式&#xff0c;集群模式。 所谓的高可用&…

如何修改远程端服务器密钥

前言 一段时间没改密码后&#xff0c;远程就会自动提示CtrlAltEnd键修改密码。但我电脑是笔记本&#xff0c;没有end键。打开屏幕键盘按这三个键也没用。 解决方法 打开远程 1、远程端WINC 输入osk 可以发现打开了屏幕键盘 2、电脑键盘同时按住CtrlAlt&#xff08;若自身电…

回溯法解决P2089 烤鸡问题太香啦,组合问题就用回溯法就对了!

学回溯的第二天&#xff0c;发现之前做过的一道洛谷的枚举题也可以用回溯法去解决&#xff0c;还是相当滴nice的。 先来看看leetcode上的这两道题 216.组合总和III 题目链接&#xff1a;216. 组合总和 III 思路就是比组合问题多了一个和为n的限制&#xff0c;大体还是可以…

嵌入式系统设计师

系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录 第一章 计算机系统基础1、数值转换数的转换数据的存储单位 第一章 计算机系统基础 1、数值转换 数的转换 数据的存储…

解决“使用Edge浏览器每次鼠标点击会出现一个黑色边框”的问题

目录 一 问题描述 二 解决方案 三 方案来源 四 参考资料 & AI工具 一 问题描述 为了方便进行收藏夹同步&#xff0c;开始从Chrome浏览器切换到Edge浏览器。在使用Edge浏览器过程中发现“每次鼠标点击会出现一个黑色边框”&#xff08;效果如下图所示&#xff09;&#…

去照片背景的方法有哪些?分享这些简单的方法给你

在忙碌的日常工作中&#xff0c;不少朋友经常需要整理大量的图片素材。有时候&#xff0c;我们需要将那些带有背景色的图片转换成透明素材&#xff0c;这样在其他场合使用起来会更加方便。那么&#xff0c;有没有一种简便的方法&#xff0c;能将图片的背景去掉&#xff0c;轻松…

宽字节注入漏洞原理以及修复方法

漏洞名称:宽字节注入 漏洞描述: 宽字节注入是相对于单字节注入而言的&#xff0c;该注入跟HTML页面编码无关&#xff0c;宽字节注入常见于mysql中&#xff0c;GB2312、GBK、GB18030、BIG5、Shift_JIS等这些都是常说的宽字节&#xff0c;实际上只有两字节。宽字节带来的安全问…

重学Java 13.面向对象.1

在熟悉的事物中循环 ——24.2.7 一、static关键字 1.static关键字的介绍以及基本使用 1.概述&#xff1a;static是一个静态关键字 2.使用&#xff1a; a.修饰一个成员变量&#xff1a; static 数据类型 变量名 b.修饰一个方法&#xff1a; 修饰符 static 返回值类型 方法名&am…