【8】【用户操作日志】操作日志SpringBootStarter
操作日志

此版本操作日志主要就是通过AOP拦截器实现的,整体主要分为AOP拦截器、自定义函数、日志上下文、扩展接口;组件提供了6个扩展点,自定义函数、日志上下文、用户信息获取,日志保存,自定义异常获取,入参过滤,业务可以根据自己的业务特性定制符合自己业务的逻辑。
1. 注解
| 注解 | 含义 |
|---|---|
| @LogRecordFunction | SpEL自定义函数扩展 |
| @LogRecordAnnotation | 记录操作日志 |
2. @LogRecordAnnotation(声明记录操作日志)
| 字段 | 是否必填 | 含义 | EL表达式 |
|---|---|---|---|
| bizCode | 是 | 业务编码 | 是 |
| msg | 是 | 日志描述 | 是 |
| result | 否 | 操作结果,默认【成功/(失败:errMsg)】,填写后(成功)替换为(填写值) | 是 |
| fileId | 否 | 文件ID,可配置在注解上或者配置到上下文中 | 是 |
| bizId | 否 | 批次ID,可配置在注解上或者配置到上下文中 | 是 |
| param | 否 | 操作说明,默认为入参,填写后为(填写值)+入参 | 是 |
| extra | 否 | 任意值 | 是 |
3. @LogRecordFunction(声明SpEL自定义函数)
| 字段 | 是否必填 | 含义 |
|---|---|---|
| value | 否 | 函数名称 |
函数名称示例
| 类@LogRecordFunction | 方法@LogRecordFunction | 函数名称 |
|---|---|---|
| value=“class” | value=“method” | class_method |
| value=“” | value=“method” | method |
| value=“class” | value=“” | class_方法名称 |
| value=“” | value=“” | 方法名称 |
4. LogRecordContext,操作日志上下文
例如文件ID,操作ID有些时候,入参不方便获取,可以在方法中放入日志上下文中。
/*** 文件ID*/
public static final String CONTEXT_KEY_NAME_FILE_ID = "fileId";
/*** 批次ID*/
public static final String CONTEXT_KEY_NAME_BATCH_ID = "batchId";
LogRecordContext.putVariable(LogRecordContext.CONTEXT_KEY_NAME_FILE_ID,"123")
5. IOperatorGetService,扩展接口
public interface IOperatorGetService {/*** 获取登录用户** @return 用户*/Object getUser();/*** 后续处理日志记录** @param logRecordDTO 日志记录实体*/void insertLogRecord(LogRecordDTO logRecordDTO);/*** 自定义通知返回值错误信息解析** @param result result* @return errMsg*/String customResponseError(Object result);/*** 入参过滤* @param args 方法参数列表** @return 入参过滤*/String paramFilter(Object[] args);}
6. QuickStart
项目Maven地址
<dependency><groupId>io.github.moyifengxue</groupId><artifactId>log-record-spring-boot-starter</artifactId><version>1.0.0</version>
</dependency>
GitHub地址
https://github.com/moyifengxue/log-record-spring-boot-starter
QuickStart
项目支持SpringBoot2.x以及升级后的SpringBoot3.x开箱即用,因为只是一个简单的AOP拦截器,目前无需再配置文件配置数据。
但是用户需要自己实现IOperatorGetService扩展接口,将其实现类注入到Spring容器中即可。
6.1 getUser():
一般直接返回用户项目中上下文中的用户信息即可。
6.2 insertLogRecord(LogRecordDTO logRecordDTO):
入参为logRecordDTO,即AOP拦截器获取到的数据,实现此接口进行自定义的数据存储。
6.3 customResponseError,paramFilter
此两个方法只是对result数据和param参数做一定的处理。
相关文章:
【8】【用户操作日志】操作日志SpringBootStarter
操作日志 此版本操作日志主要就是通过AOP拦截器实现的,整体主要分为AOP拦截器、自定义函数、日志上下文、扩展接口;组件提供了6个扩展点,自定义函数、日志上下文、用户信息获取,日志保存,自定义异常获取,入…...
【游戏逆向】寻路函数隐藏检测点分析
案例: 某游戏出现调用寻路函数失败异常崩溃。 基本情况分析: 在刚登陆游戏的时候直接调用寻路函数崩溃。 手动寻路以后再调用寻路不崩溃。(排除了函数编写错误的可能) 猜测可能检测方法: 有某一个标志位(全局类型)在游戏刚登陆的时候没…...
【Zabbix实战之运维篇】Zabbix监控Docker容器配置方法
【Zabbix实战之运维篇】Zabbix监控Docker容器配置方法 一、检查Zabbix监控平台状态1.检查Zabbix各组件容器状态2.奸诈Zabbix-server状态二、下载监控模板1.进入Zabbix官网下载页面2.查看下载模板三、创建一个测试容器1.创建一个测试容器2.检查测试容器状态3.访问测试web服务四、…...
这款 Python 工具进行数据分析及数据可视化真的很棒啊
前言 大家好,今天我们以全国各地区衣食住行消费数据为例,来分析2022年中国统计年鉴数据,统计全国各地人民的消费地图,看看: 哪个省份的人最能花钱 哪个省份的人最舍得花钱 哪个省份的人最抠门 全国各地区人民在吃、穿…...
visual Studio Code常用快捷键
1、向上/向下移动代码行 alt 下箭头/上箭头 2、向上/向下复制一行代码 shiftalt 下箭头/上箭头 3、选定多个相同的单词 ctrl d 4、全局替换 ctrl h 5、快速定位到某一行 ctrl g 6、放大缩小整个编辑器界面 ctrl / - 7、添加多个光标 Ctrl Alt 上箭头/下箭头…...
基础(一)十六进制转八进制
试题 基础练习 十六进制转八进制 资源限制 内存限制:512.0MB C/C时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 问题描述 给定n个十六进制正整数,输出它们对应的八进制数。输入格式 输入的第…...
梯度提升算法决策过程的逐步可视化
梯度提升算法是最常用的集成机器学习技术之一,该模型使用弱决策树序列来构建强学习器。这也是XGBoost和LightGBM模型的理论基础,所以在这篇文章中,我们将从头开始构建一个梯度增强模型并将其可视化。 梯度提升算法介绍 梯度提升算法&#x…...
Linux系统调用之文件属性操作函数
前言 如果,想要深入的学习Linux系统调用中access,chmod,chown,truncate这些有关于文件属性的操作函数,还是需要去自己阅读Linux系统中的帮助文档。 具体输入命令: man 2 access/chmod/chown/truncate 即可…...
VMware 安装 银河麒麟高级服务器操作系统 V10 + QT 开发环境搭建
下载并安装vmware 下载银河麒麟操作烯烃服务器版v10的镜像文件从官网下载,因为是x86的电脑芯片,选择AMD64版,即vmare 安装麒麟操作系统注意事项:安装位置选择自动分区网络和主机名设置打开网络,ip4就不用再设置了创建一…...
2023年疫情开放,国内程序员薪资涨了还是跌了?大数据告诉你答案
自从疫情开放,国内各个行业都开始有复苏的迹象,尤其是旅游行业更是空前暴涨,那么互联网行业如何? 有人说今年好找工作多了,有人说依然是内卷得一塌糊涂,那么今年开春以来,各个岗位的程序员工资…...
太赫兹频段耦合器设计相关经验总结
1拿到耦合器的频段后,确定中心频率和波导的宽度和高度 此处贴一张不同频段对应的波导尺寸图 需要注意的是1英寸 2.54厘米,需注意换算 具体网址:矩形波导尺寸 | 扩维 (qualwave.com) 仅列举我比较常用的太赫兹频段部分 2.以220~320GHz频段&a…...
反弹shell数据不回显带外查询pikaqiu靶场搭建
P1 文件上传下载(解决无图形化和解决数据传输) 解决无图形化: 当我们想下载一个文件时,通常是通过浏览器的一个链接直接访问网站点击下载的,但是在实际的安全测试中,我们获取的权限只是一个执行命令的窗口…...
按键修改阈值功能、报警功能、空气质量功能实现
按键修改阈值功能 要使用按键,首先要定义按键。通过查阅资料,可知按键的引脚如图所示:按键1(S1)通过KEY0与PA0连接,按键2(S2)通过KEY1与PE2连接,按键3(S3&…...
spring重点整理篇--springMVC(嘿嘿,开心哟)
Spring MVC是的基于JavaWeb的MVC框架,是Spring框架中的一个组成部分(WEB模块) MVC设计模式: Controller(控制器) Model(模型) View(视图) 重点来了😄 SpringMVC的工作机制…...
图像融合评估指标Python版
图像融合评估指标Python版 这篇博客利用Python把大部分图像融合指标基于图像融合评估指标复现了,从而方便大家更好的使用Python进行指标计算,以及一些I/O 操作。除了几个特征互信息的指标没有成功复现之外,其他指标均可以通过这篇博客提到的P…...
20230303----重返学习-函数概念-函数组成-函数调用-形参及匿名函数及自调用函数
day-019-nineteen-20230303-函数概念-函数组成-函数调用-形参及匿名函数及自调用函数 变量 变量声明 变量 声明定义(赋值) var num;num 100; 声明与赋值分开var num 100; 声明时就赋值 赋值只能声明一次,可以赋值无数次 变量声明关键词 varconstletclassfunctio…...
Java面试题总结
文章目录前言1、JDK1.8 的新特性有哪些?2、JDK 和 JRE 有什么区别?3、String,StringBuilder,StringBuffer 三者的区别?4、为什么 String 拼接的效率低?5、ArrayList 和 LinkedList 有哪些区别?6…...
深圳大学计软《面向对象的程序设计》实验7 拷贝构造函数与复合类
A. Point&Circle(复合类与构造) 题目描述 类Point是我们写过的一个类,类Circle是一个新的类,Point作为其成员对象,请完成类Circle的成员函数的实现。 在主函数中生成一个圆和若干个点,判断这些点与圆的位置关系,…...
Java的JVM(Java虚拟机)参数配置
JVM原理 (1)jvm是java的核心和基础,在java编译器和os平台之间的虚拟处理器,可在上面执行字节码程序。 (2)java编译器只要面向jvm,生成jvm能理解的字节码文件。java源文件经编译成字节码程序&a…...
leetcode 困难 —— 数据流的中位数(优先队列)
题目: 中位数是有序整数列表中的中间值。如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。 例如 arr [2,3,4] 的中位数是 3 。 例如 arr [2,3] 的中位数是 (2 3) / 2 2.5 。 实现 MedianFinder 类: MedianFinder() 初始化…...
AudioLDM-S实战教程:为有声书项目批量生成章节过渡音效(含脚本)
AudioLDM-S实战教程:为有声书项目批量生成章节过渡音效(含脚本) 1. 项目简介 AudioLDM-S是一个专门生成现实环境音效的AI工具,基于audioldm-s-full-v2模型的轻量级Gradio实现。无论你需要电影配音、游戏音效还是助眠白噪音&…...
FxSound高级功能开发:插件系统与第三方集成技术深度解析
FxSound高级功能开发:插件系统与第三方集成技术深度解析 【免费下载链接】fxsound-app FxSound application and DSP source code 项目地址: https://gitcode.com/gh_mirrors/fx/fxsound-app FxSound是一款专业的数字音频处理软件,其强大的插件系…...
3秒守护隐私:Boss-Key重新定义窗口智能管理
3秒守护隐私:Boss-Key重新定义窗口智能管理 【免费下载链接】Boss-Key 老板来了?快用Boss-Key老板键一键隐藏静音当前窗口!上班摸鱼必备神器 项目地址: https://gitcode.com/gh_mirrors/bo/Boss-Key 在数字化办公环境中,窗…...
告别手动gc.collect()!2026 Python内存自适应策略上线:动态分代阈值、对象生命周期AI建模、NUMA感知分配器三合一
第一章:Python 智能体内存管理策略 2026 最新趋势Python 在 2026 年已深度融入 AI 基础设施与边缘智能体(Intelligent Agent)系统,其内存管理机制正从传统引用计数 循环检测双层模型,演进为感知式、上下文驱动的动态调…...
Nemo文件管理器:超越基础操作的7个高效场景解决方案
Nemo文件管理器:超越基础操作的7个高效场景解决方案 【免费下载链接】nemo File browser for Cinnamon 项目地址: https://gitcode.com/gh_mirrors/ne/nemo Nemo作为Cinnamon桌面环境的默认文件管理器,不仅仅是简单的文件浏览工具,它隐…...
当游戏语言成为障碍:如何用XUnity.AutoTranslator打破语言壁垒
当游戏语言成为障碍:如何用XUnity.AutoTranslator打破语言壁垒 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 想象一下,你终于等到了期待已久的日式角色扮演游戏,但打…...
不止于安装:将Helowin Oracle 11g Docker镜像改造为可持续使用的开发数据库
从临时容器到生产级服务:Helowin Oracle 11g Docker镜像深度定制指南 当开发团队决定采用Docker化的Oracle数据库作为开发测试环境时,往往会遇到一个尴尬的现实:大多数现成镜像要么过于臃肿,要么配置不符合项目规范。Helowin的Ora…...
UniHacker终极指南:免费解锁Unity全平台专业功能的完整方案
UniHacker终极指南:免费解锁Unity全平台专业功能的完整方案 【免费下载链接】UniHacker 为Windows、MacOS、Linux和Docker修补所有版本的Unity3D和UnityHub 项目地址: https://gitcode.com/GitHub_Trending/un/UniHacker 作为一名Unity开发者,你是…...
Kubernetes集群管理终极指南:使用kubectx和kubens高效切换上下文与命名空间
Kubernetes集群管理终极指南:使用kubectx和kubens高效切换上下文与命名空间 【免费下载链接】kubectx Faster way to switch between clusters and namespaces in kubectl 项目地址: https://gitcode.com/gh_mirrors/ku/kubectx 在Kubernetes多集群环境中&am…...
从“三次握手”到文件落地:用Wireshark抓包带你彻底搞懂C++ Socket文件传输全过程
从“三次握手”到文件落地:用Wireshark抓包带你彻底搞懂C Socket文件传输全过程 当你在浏览器下载文件时,是否好奇过数据是如何跨越网络准确无误地到达你的电脑?本文将带你用C实现一个完整的TCP文件传输程序,并通过Wireshark抓包工…...
