Springboot整合AOP实现日志的保存

1.定义注解

/*** 系统日志元注解*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LogFilter {String value() default "" ;
}

2.编写切面的实现

@Aspect
@Component
public class LogAspect {private static final Logger LOGGER = LoggerFactory.getLogger(LogAspect.class) ;//切入点,已经被增强的连接点。@Pointcut("@annotation(com.boot.aop.config.LogFilter)")public void logPointCut (){}//通知增强代码@Around("logPointCut()")public Object around (ProceedingJoinPoint point) throws Throwable {Object result = null ;try{// 执行方法result = point.proceed();// 保存请求日志saveRequestLog(point);} catch (Exception e){// 保存异常日志saveExceptionLog(point,e.getMessage());}return result;}/*** 捕获异常:/ by zero* 请求路径:http://localhost:8011/saveExceptionLog* 请求方法:saveExceptionLog* 模块描述:保存异常日志* 请求参数:["cicada"]*/private void saveExceptionLog (ProceedingJoinPoint point,String exeMsg){LOGGER.info("捕获异常:"+exeMsg);HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();LOGGER.info("请求路径:"+request.getRequestURL());MethodSignature signature = (MethodSignature) point.getSignature();Method method = signature.getMethod();LOGGER.info("请求方法:"+method.getName());// 获取方法上LogFilter注解LogFilter logFilter = method.getAnnotation(LogFilter.class);String value = logFilter.value() ;LOGGER.info("模块描述:"+value);Object[] args = point.getArgs();LOGGER.info("请求参数:"+ JSONObject.toJSONString(args));}/*** 请求路径:http://localhost:8011/saveRequestLog* 请求方法:saveRequestLog* 模块描述:保存请求日志* 请求参数:["cicada"]*/private void saveRequestLog (ProceedingJoinPoint point){HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();LOGGER.info("请求路径:"+request.getRequestURL());MethodSignature signature = (MethodSignature) point.getSignature();Method method = signature.getMethod();LOGGER.info("请求方法:"+method.getName());// 获取方法上LogFilter注解LogFilter logFilter = method.getAnnotation(LogFilter.class);String value = logFilter.value() ;LOGGER.info("模块描述:"+value);Object[] args = point.getArgs();LOGGER.info("请求参数:"+ JSONObject.toJSONString(args));}
}

3.测试

@LogFilter("保存请求日志")@RequestMapping("/saveRequestLog")public String saveRequestLog (@RequestParam("name") String name){return "success:"+name ;}@LogFilter("保存异常日志")@RequestMapping("/saveExceptionLog")public String saveExceptionLog (@RequestParam("name") String name){int error = 100 / 0 ;System.out.println(error);return "success:"+name ;}
}

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

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

相关文章

安装程序报错“E: Sub-process /usr/bin/dpkg returned an error code (1)”的解决办法

今天在终端使用命令安装程序时出现了如下的报错信息。 E: Sub-process /usr/bin/dpkg returned an error code (1) 这种情况下安装什么程序最终都会报这个错,具体的报错截图如下图所示。 要解决这个问题,首先使用下面的命令进到相应的目录下。 cd /var/…

驱动开发--day2(内核不同模块的相互访问、字符设备驱动、led控制实验代码及现象)

实现三盏灯的控制,编写应用程序测试 head.h #ifndef __HEAD_H__ #define __HEAD_H__#define LED1_MODER 0X50006000 #define LED1_ODR 0X50006014 #define LED1_RCC 0X50000A28#define LED2_MODER 0X50007000 #define LED2_ODR 0X50007014#endif mychrdev.c #inc…

记录mac虚拟机安装centos7

一. 安装VMWare Fusion(略) 二. 寻找arm64架构mac能拉起来的centos7镜像(略) 参考 https://cloud.tencent.com/developer/article/2150583?areaSource106000.2&traceIdkybnG2SKASN5GqSBiSmu9 三. 从origin镜像安装后开始记…

GaussDB数据库SQL系列-数据去重

目录 一、前言 二、数据去重应用场景 三、数据去重案例(GaussDB) 1、示例场景描述 2、定义重复数据 3、制定去重规则 4、创建测试数据(GaussDB) 5、编写去重方法(GaussDB) 6、附:全字段…

windows如何更改/禁用系统更新

提示:首先说明这属于将更新时间更改,不过你可以的将更新时间更改为十年一百年 废话不多说开始正文: 1.首先:winR打开运行,输入regedit,进入注册表编辑器 2.进入编辑器后依次点击:HKEY_LOCAL_MACHINE\SOFT…

【Linux成长史】Linux基本指令大全

🎬 博客主页:博主链接 🎥 本文由 M malloc 原创,首发于 CSDN🙉 🎄 学习专栏推荐:LeetCode刷题集 数据库专栏 初阶数据结构 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如…

nginx空字节漏洞复现

将nginx复制到C盘根目录 cmd运行startup.bat 安装完成后访问 输入info.php 输入info.png 抓包使用00截断 可以看到phpinfo成功执行 在PHP的底层C语言里,%00代表着字符串结束,00截断可以用来绕过后端验证,后端验证的时候因为00截断认为文件是…

Redis初识

目录 前言 一、Redis是什么? 二、下载与安装 1.下载 2.安装 3.启动Redis 三、Redis操作 3.1基本操作 3.2五种常用数据类型 3.2.1.string 基础命令 数值型数据 3.2.2 Hash 基础命令 3.2.3 List 基本操作 3.2.4 Set 基本使用 3.2.5 sorted_set 基础…

深度ESP32 PWM教程如何在ESP32 中使用PWM

关于ESP32PWM的简要说明 ESP32 SoC 满载了非常有用的外设,PWM 就是其中之一。是的。ESP32 的芯片中有一个专用的 PWM 硬件模块。脉宽调制或简称PWM是一种成熟且广泛使用的供电技术。 您可以使用 ESP32 的 PWM 来驱动 LED、电机(普通直流电机和无刷电机…

jmeter 计数器Counter

计数器可以用于生成动态的数值或字符串,以模拟不同的用户或数据。 计数器通常与用户线程组结合使用,以生成不同的变量值并在测试中应用。以下是计数器的几个常用属性: 变量前缀(Variable Name Prefix):定义…

开源协议对比:局限性、应注意事项与详细对比

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

生成式AI的JavScript技术栈

如果不使用新的软件基础设施技术,就很难理解它们。 至少,a16z 基础设施团队发现了这一点,而且因为我们中的许多人都是以程序员的身份开始职业生涯的,所以我们经常通过实践来学习。 尤其是生成式AI浪潮的情况尤其如此,它…