AOP实现操作日志记录

文章目录

    • 1.common-log4j2-starter
        • 1.目录
        • 2.pom.xml 引入依赖
        • 3.LogAspect.java
        • 4.Log4j2AutoConfiguration.java Log4j2自动配置类条件注入切面类
    • 2.common-log4j2-starter-demo 测试
        • 1.目录
        • 2.application.yml 启用日志切面
        • 3.TraceController.java
        • 4.结果

1.common-log4j2-starter

1.目录

CleanShot 2024-10-24 at 22.06.38@2x

2.pom.xml 引入依赖
<!-- aop -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!-- gson -->
<dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId>
</dependency>
3.LogAspect.java
package com.sunxiansheng.log4j2.aspectj;import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;@Aspect
@Slf4j
public class LogAspect {// 使用 Gson 序列化对象,启用 PrettyPrinting,输出格式化的 JSONprivate static final Gson GSON = new GsonBuilder().setPrettyPrinting() // 启用格式化输出.disableHtmlEscaping() // 禁用 HTML 转义,保留字符原始形式.create();// ANSI 颜色代码private static final String ANSI_RESET = "\u001B[0m";     // 重置颜色private static final String ANSI_CYAN = "\u001B[92m";     // 绿色/*** 配置切点,匹配 Controller 和 Service 层的所有方法*/@Pointcut("execution(* com.sunxiansheng..controller..*(..)) || execution(* com.sunxiansheng..service..*(..))")public void applicationPackagePointcut() {// 方法为空,这是一个切点定义}/*** 环绕通知,记录方法执行的详细信息** @param joinPoint 切入点* @return 方法执行结果* @throws Throwable 异常*/@Around("applicationPackagePointcut()")public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {// 获取方法签名和详细信息MethodSignature signature = (MethodSignature) joinPoint.getSignature();String className = signature.getDeclaringTypeName();String methodName = signature.getName();// 获取方法参数Object[] args = joinPoint.getArgs();String requestParams = GSON.toJson(args);// 记录方法进入日志,参数从下一行开始输出,参数部分以黄色显示log.info("==> 进入方法: {}.{}()", className, methodName);log.info("参数:\n" + ANSI_CYAN + "{}" + ANSI_RESET, requestParams);// 记录方法执行开始时间long startTime = System.currentTimeMillis();Object result;try {// 执行目标方法result = joinPoint.proceed();} catch (Throwable throwable) {// 捕获并记录异常信息,堆栈信息从下一行开始输出String exceptionStackTrace = getStackTraceAsString(throwable);log.error("<== 方法异常: {}.{}() | 异常信息: {}", className, methodName, throwable.getMessage());log.error("堆栈信息:\n{}", exceptionStackTrace);throw throwable;  // 重新抛出异常,保持原有异常机制}// 记录方法执行结束时间long endTime = System.currentTimeMillis();long executionTime = endTime - startTime;// 获取方法返回值String response = GSON.toJson(result);// 记录方法退出日志,返回值从下一行开始输出,返回值部分以黄色显示log.info("<== 退出方法: {}.{}() | 耗时: {} ms", className, methodName, executionTime);log.info("返回值:\n" + ANSI_CYAN + "{}" + ANSI_RESET, response);return result;}/*** 将异常的堆栈信息转换为字符串** @param throwable 异常* @return 堆栈信息字符串*/private String getStackTraceAsString(Throwable throwable) {StringBuilder sb = new StringBuilder();for (StackTraceElement element : throwable.getStackTrace()) {sb.append("\tat ").append(element.toString()).append("\n");}return sb.toString();}
}
4.Log4j2AutoConfiguration.java Log4j2自动配置类条件注入切面类
package com.sunxiansheng.log4j2.config;import com.sunxiansheng.log4j2.aspectj.LogAspect;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** Description: Log4j2自动配置类** @Author sun* @Create 2024/10/24 10:36* @Version 1.0*/
@Configuration
public class Log4j2AutoConfiguration {/*** 条件注入LogAspect** @return*/@Bean@ConditionalOnMissingBean@ConditionalOnProperty(name = "log.aspect.enable", havingValue = "true", matchIfMissing = true)LogAspect logAspect() {return new LogAspect();}
}

2.common-log4j2-starter-demo 测试

1.目录

CleanShot 2024-10-24 at 22.08.54@2x

2.application.yml 启用日志切面
log:aspect:enable: true # 开启自定义的日志切面
3.TraceController.java
/*** 测试的Bean,入参*/
@Data
static class AspectBeanIn {private String name;private Integer age;private String phone;
}/*** 测试的Bean,出参*/
@Data
static class AspectBeanOut {private String name;private Integer age;private String phone;
}@RequestMapping("/aspect")
public AspectBeanOut aspect(@RequestBody AspectBeanIn aspectBeanIn) {AspectBeanOut aspectBean = new AspectBeanOut();aspectBean.setName("sun");aspectBean.setAge(18);aspectBean.setPhone("123456789");// 出现异常int i = 1 / 0;return aspectBean;
}
4.结果

CleanShot 2024-10-24 at 22.10.18@2x

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

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

相关文章

JavaEE之线程池

前面我们了解了多个任务可以通过创建多个线程去处理&#xff0c;达到节约时间的效果&#xff0c;但是每一次的线程创建和销毁也是会消耗计算机资源的&#xff0c;那么我们是否可以将线程进阶一下&#xff0c;让消耗计算机的资源尽可能缩小呢&#xff1f;线程池可以达到此效果&a…

YOLOv11改进,YOLOv11添加HAttention注意机制用于图像修复的混合注意力转换器,CVPR2023,超分辨率重建

摘要 基于Transformer的方法在低层视觉任务中表现出色,例如图像超分辨率。然而,作者通过归因分析发现,这些网络只能利用有限的空间范围的输入信息。这意味着现有网络尚未充分发挥Transformer的潜力。为了激活更多的输入像素以获得更好的重建效果,作者提出了一种新型的混合…

Shader -> SweepGradient扫描渐变着色器详解

XML文件 <com.example.myapplication.MyViewxmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_gravity"center"android:layout_height"400dp"/>自定义View代码 c…

LabVIEW调用不定长数组 DLL数组

在使用 LabVIEW 调用 DLL 库函数时&#xff0c;如果函数中的结构体包含不定长数组&#xff0c;直接通过 调用库函数节点&#xff08;Call Library Function Node&#xff09; 调用通常会遇到问题。这是因为 LabVIEW 需要与 DLL 中的数据结构完全匹配&#xff0c;而包含不定长数…

IOS开发如何从入门进阶到高级

针对iOS开发的学习&#xff0c;不同阶段应采取不同的学习方式&#xff0c;以实现高效提升.本文将iOS开发的学习分为入门、实战、进阶三个阶段&#xff0c;下面分别详细介绍. 一、学习社区 iOS开源中国社区 这个社区专注于iOS开发的开源项目分享与协作&#xff0c;汇集了大量开…

Next.js 实战 (七):浅谈 Layout 布局的嵌套设计模式

业务场景 在目前常见的中后台管理系统中&#xff0c;比较常见的是固定的布局方式包裹页面&#xff0c;但一些特殊页面&#xff0c;比如&#xff1a;登录页面、注册页面、忘记密码页面这些页面是不需要布局包裹的。 但在 Next.js AppRouter 中&#xff0c;必须包含一个根布局文…

基于 Python 和 OpenCV 的人脸识别上课考勤管理系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

人工智能与物联网:智慧城市的未来

引言 清晨6点&#xff0c;智能闹钟根据你的睡眠状态和天气情况&#xff0c;自动调整叫醒时间&#xff1b;窗帘缓缓打开&#xff0c;阳光洒满房间&#xff1b;厨房里的咖啡机已经为你准备好热饮&#xff0c;而无人驾驶公交车正按时抵达楼下站点。这不是科幻电影的场景&#xff…

python-leetcode-无重复字符的最长子串

3. 无重复字符的最长子串 - 力扣&#xff08;LeetCode&#xff09; class Solution:def lengthOfLongestSubstring(self, s: str) -> int:char_set set()left 0max_length 0for right in range(len(s)):while s[right] in char_set:char_set.remove(s[left])left 1char_…

新版本的IDEA如何解决Git分支显示为警告⚠<unknown>的问题

目录 问题再现 解决思路 首先我们要想到 这个分支有没有从远程代码仓库拉去下来 复习一下 git 命令 其次思考 最后思考 问题再现 这边我使用的是 IDEA 2024.3.3.1 Jetbrains 官网的最新版 同时也是官方账号登录 的 今天上 github 去拉项目到 本地 出现了分支不显示的问…

libusb学习——简单介绍

文章目录 libusb 简介libusb 编译libusb 源码目录介绍核心代码文件平台支持例子 API使用libusb初始化和去初始化libusb设备处理和枚举libusb 杂项libusb USB描述符libusb 设备热插拔事件通知libusb 异步设备I/Olibusb 同步设备I/Olibusb 轮询与定时 libusb 涉及技术参考 libusb…

案例解读 | 香港某多元化综合金融企业基础监控+网管平台建设实践

PART01 项目背景 01客户简介案例客户是一家创立20多年的香港某多元化综合金融企业&#xff0c;其业务范围涵盖证券、期货、资产管理、财富管理等&#xff0c;凭借广泛的业务网络和多元化的金融服务产品&#xff0c;在市场中拥有显著的影响力。02痛点分析随着业务版图的持续拓展…

551 灌溉

常规解法&#xff1a; #include<bits/stdc.h> using namespace std; int n,m,k,t; const int N105; bool a[N][N],b[N][N]; int cnt; //设置滚动数组来存贮当前和下一状态的条件 //处理传播扩散问题非常有效int main() {cin>>n>>m>>t;for(int i1;i&l…

【简博士统计学习方法】第1章:4. 模型的评估与选择

4. 模型的评估与选择 4.1 训练误差与测试误差 假如存在样本容量为 N N N的训练集&#xff0c;将训练集送入学习系统可以训练学习得到一个模型&#xff0c;我们将这么模型用决策函数的形式表达&#xff0c;也就是 y f ^ ( x ) y\hat{f}(x) yf^​(x)&#xff0c;关于模型的拟合…

【css】浏览器强制设置元素状态(hover|focus……)

直接上步骤&#xff1a; 打开浏览器控制台 → 找到样式选项 → 找到:hov选项 → 点击:hov选项&#xff0c;会展开【设置元素状态】。 只要选中就会展示出自己写在css里面的该种状态下的样式了。

LabVIEW水轮发电机组振动摆度故障诊断

本文介绍了基于LabVIEW的水轮发电机组振动摆度故障诊断系统的设计与实施过程。系统在通过高效的故障诊断功能&#xff0c;实现水轮发电机组的振动、温度等关键指标的实时监控与智能分析&#xff0c;从而提高电力设备的可靠性和安全性。 ​ 项目背景 随着电力行业对设备稳定性…

pytorch模型的保存失敗しましたが、

目录 简洁&#xff1a; 评估模式 后缀 区别 保存模型&#xff08;整个模型&#xff09; 加载过程: 保存状态字典 加载过程: 总结 把模型训练到一半保存&#xff0c;想下次接着训练&#xff0c;用那种保存方式 保存模型和优化器状态字典 加载模型和优化器状态字典 如…

风水算命系统架构与功能分析

系统架构 服务端&#xff1a;Java&#xff08;最低JDK1.8&#xff0c;支持JDK11以及JDK17&#xff09;数据库&#xff1a;MySQL数据库&#xff08;标配5.7版本&#xff0c;支持MySQL8&#xff09;ORM框架&#xff1a;Mybatis&#xff08;集成通用tk-mapper&#xff0c;支持myb…

Unity + Firebase + GoogleSignIn 导入问题

我目前使用 Unity版本&#xff1a;2021.3.33f1 JDK版本为&#xff1a;1.8 Gradle 版本为&#xff1a;6.1.1 Firebase 版本: 9.6.0 Google Sign In 版本为&#xff1a; 1.0.1 问题1 &#xff1a;手机点击登录报错 apk转化成zip&#xff0c;解压&#xff0c;看到/lib/armeabi-v…

微信原生小程序自定义封装组件(以导航navbar为例)

封装 topnav.js const App getApp(); Component({// 组件的属性列表properties: {pageName: String, //中间的titleshowNav: { //判断是否显示左上角的按钮 type: Boolean,value: true},showHome: { //判断是否显示左上角的home按钮type: Boolean,value: true},showLocat…