一个小小的注解,帮你搞定 SpringBoot 操作日志

Springboot - 注解 - 操作日志< bizlog-sdk> Springboot - 注解 - 操作日志< bizlog-sdk>用户登录后,调用后台接口接口,把token对应的用户信息存入redis.后台通过header获取token,再根据token查询redis中对应用户信息。 阅读详情

此组件解决的问题是:

「谁」在「什么时间」对「什么」做了「什么事」

本组件目前针对 Spring-boot 做了 Autoconfig,如果是 SpringMVC,也可自己在 xml 初始化 bean

使用方式

基本使用

maven 依赖添加 SDK 依赖

<dependency>
<groupId>io.github.mouzt</groupId>
<artifactId>bizlog-sdk</artifactId>
<version>1.0.4</version>
</dependency>
 

SpringBoot 入口打开开关, 添加 @EnableLogRecord 注解

tenant 是代表租户的标识,一般一个服务或者一个业务下的多个服务都写死一个 tenant 就可以

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@EnableTransactionManagement
@EnableLogRecord(tenant = "com.mzt.test")
public class Main {
public static void main(String[] args) {
SpringApplication.run(Main.class, args);
}
}
 

日志埋点

1. 普通的记录日志

  • pefix:是拼接在 bizNo 上作为 log 的一个标识。避免 bizNo 都为整数 ID 的时候和其他的业务中的 ID 重复。比如订单 ID、用户 ID 等
  • bizNo:就是业务的 ID,比如订单 ID,我们查询的时候可以根据 bizNo 查询和它相关的操作日志
  • success:方法调用成功后把 success 记录在日志的内容中
  • SpEL 表达式:其中用双大括号包围起来的(例如:{ {#order.purchaseName}})#order.purchaseName 是 SpEL 表达式。Spring 中支持的它都支持的。比如调用静态方法,三目表达式。SpEL 可以使用方法中的任何参数

@LogRecordAnnotation(success = "{ {#order.purchaseName}}下了一个订单,购买商品「{ {#order.productName}}」,下单结果:{ {#_ret}}",
prefix = LogRecordType.ORDER, bizNo = "{ {#order.orderNo}}")
public boolean createOrder(Order order) {
log.info("【创建订单】orderNo={}", order.getOrderNo());
// db insert order
return true;
}
 

此时会打印操作日志 “张三下了一个订单, 购买商品「超值优惠红烧肉套餐」, 下单结果: true”

2. 期望记录失败的日志, 如果抛出异常则记录 fail 的日志,没有抛出记录 success 的日志

@LogRecordAnnotation(
fail = "创建订单失败,失败原因:「{ {#_errorMsg}}」",
success = "{ {#order.purchaseName}}下了一个订单,购买商品「{ {#order.productName}}」,下单结果:{ {#_ret}}",
prefix = LogRecordType.ORDER, bizNo = "{ {#order.orderNo}}")
public boolean createOrder(Order order) {
log.info("【创建订单】orderNo={}", order.getOrderNo());
// db insert order
return true;
}
 

其中的 #_errorMsg 是取的方法抛出异常后的异常的 errorMessage。

3. 日志支持种类

比如一个订单的操作日志,有些操作日志是用户自己操作的,有些操作是系统运营人员做了修改产生的操作日志,我们系统不希望把运营的操作日志暴露给用户看到,

@LogRecordAnnotation(
fail = "创建订单失败,失败原因:「{ {#_errorMsg}}」",
category = "MANAGER",
success = "{ {#order.purchaseName}}下了一个订单,购买商品「{ {#order.productName}}」,下单结果:{ {#_ret}}",
prefix = LogRecordType.ORDER, bizNo = "{ {#order.orderNo}}")
public boolean createOrder(Order order) {
log.info("【创建订单】orderNo={}", order.getOrderNo());
// db insert order
return true;
}
 

4. 支持记录操作的详情或者额外信息

如果一个操作修改了很多字段,但是 success 的日志模版里面防止过长不能把修改详情全部展示出来,这时候需要把修改的详情保存到 detail 字段,

detail 是一个 String ,需要自己序列化。这里的 #order.toString() 是调用了 Order 的 toString

SpringBoot自定义注解实现操作日志(适用于毕设) 在目录中,有一个annotation文件夹,这里面放的就是日志的注解。String value() default "未命名日志";在aop文件夹中,存放改注解的切面@Aspect@Order@Component//这里操作人姓名暂时设置未知,具体操作的人,需要通过其他方法获取,这里仅对日志以及自定义注解的使用做简单介绍。String userName = "未知";// 异步记录日志。 阅读详情

相关推荐

SpringBoot+AOP+自定义注解,优雅实现日志记录

AOP切面编程+自定义注解,优雅记录系统日志

小学生波波 1万+

springboot—spring aop 实现系统操作日志记录存储到数据库

采用方案: 使用spring 的 aop 技术切到自定义注解上,针对不同注解标志进行参数解析,记录日志 缺点:要针对每个不同的注解标志进行分别取注解标志,获取参数进行日志记录输出 1. 需要引用的依赖 <!--spring切面aop依赖--> <dependency> <groupId>org.springframework.boot</g...

古月的博客 4744

SpringBoot Aop 记录操作日志存入数据库

SpringBoot Aop 记录操作日志存入数据库 本文不探讨具体原理,只讲业务实现。我主要是将这个操作分为以下几步: 1.首先我们需要自定义一个操作注解来获取我们拦截的接口的相关信息 2.那么接下来就是这个操作注解放在哪里了 我们需要将该注解放在我们需要拦截的接口上,那这个接口具体属于哪个模块,我们就可以命名moduleName即模块名,option就是这个接口具体是干什么的。注意,所有加...

吴昊的博客 3574

使用SpringBoot记录用户操作日志

COMMENT ON COLUMN "SCOTT"."SYS_LOG"."CREATE_TIME" IS '创建时间';COMMENT ON COLUMN "SCOTT"."SYS_LOG"."OPERATION" IS '用户操作';COMMENT ON COLUMN "SCOTT"."SYS_LOG"."METHOD" IS '请求方法';在工作中我们可能会遇到一个需求,就是记录用户的操作信息,接下来使用spring的aop特性实现这一需求。二、自定义一个注解,用于标注需要监控的方法。

xiaoheihai666的博客 4150

Java基于注解实现日志记录模块,超详细注释!

在项目开发过程中,日志记录是一个至关重要的环节,它能够帮助开发人员追踪用户的重要操作,如新增、删除、修改等,从而有效监控系统的运行状态。通过日志记录,我们可以深入了解系统的运行情况,及时发现并解决问题,优化性能,提高用户体验。

m0_66216860的博客 2719

若依框架使用springboot+AOP+自定义注解+反射实现操作日志记录修改前后数据,并保存至数据库日志表中

若依框架使用springboot+AOP+自定义注解+反射实现操作日志记录修改前后数据,并保存至数据库日志表中

kay523393的博客 2166

SpringBoot中使用自定义注解,AOP统一处理打印日志

简述 打印日志这块,基本上每个程序都需要,有了日志的记录和输出,方便攻城狮们更好的监控项目和排查错误 通常日志这块,会用AOP写个切面,来进行一个统一处理,但是问题点是这样是锁定在controller层,不够灵活,如果只是单独的想让一个借口输出日志的话,就。。。。。。 最近在用SpringBoot框架,经常看一些这方面的博客,偶然间看到一篇利用注解来完成日志的统一处理问题,实现效果,只要把想...

Snow、杨 1296

Springboot-注解-通用操作日志组件

此组件解决的问题是: 「谁」在「什么时间」对「什么」做了「什么事」。本组件目前针对 Spring-boot 做了 Autoconfig,如果是 SpringMVC,也可自己在 xml 初始化 bean。

qq_39239712的博客 1173

Springboot使用Aspect实现切面日志

引领完成Docker的安装、部署、管理和扩展,让其经历从测试到生产的整个开发生命周期,深入了解Docker适用于什么场景。并且这本Docker的学习权威指南介绍了其组件的基础知识,然后用Docker构建容器和服务来完成各种任务:利用Docker为新项目建立测试环境,演示如何使用持续集成的工作流集成Docker,如何构建应用程序服务和平台,如何使用Docker的API,如何扩展Docker。

2401_84046876的博客 1127

SpringBoot SpringAOP实现操作日志记录功能

项目环境: JDK1.8 SpringBoot2.3.3.RELEASE SpringAop2.3.3.RELEASE 第一步:引入jar包 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId>

优快云_YCCAXTT的博客 1060

SpringBoot 自定义注解异步记录复杂日志

注解(Annotation),也叫元数据。注解其实就是代码里的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相应的处理。通过使用注解,程序员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息。@Inherited// 日志类型// 操作类型// 备注}复制代码。

m0_73311735的博客 991

Spring Boot 注解拦截器实现审计日志功能

在业务系统中,审计日志记录至关重要。系统需要记录用户的操作日志,特别是在用户操作数据库修改、查询、删除重要数据时,系统应追踪操作人的身份、操作的对象、操作的时间等关键数据。这不仅对运维、合规性有帮助,同时也能提高系统的可审计性和安全性。 本篇文章将深入讲解如何在 Spring Boot 中通过注解和拦截器实现审计日志功能。通过自定义注解,可以在不同模块、不同操作上灵活地记录审计信息,包括操作模块、操作对象属性、用户信息和 IP 地址。同时,这一方案具有高度的拓展性,可以适配于不同业务场景。

J老熊 3335

SpringBoot使用AspectJ的@Around注解实现AOP全局记录接口:请求日志、响应日志、异常日志

@Around 是 AspectJ 框架中用于环绕通知(Around Advice)的注解。环绕通知是一种非常强大的通知类型,它允许你在目标方法执行前后插入自定义的行为,甚至可以决定是否继续执行目标方法或替换其返回值。使用 @Around 注解时,需要注意以下几点:异常处理:在环绕通知中,你必须处理或重新抛出任何在 joinPoint.proceed() 调用中抛出的异常。性能影响:由于环绕通知可以在方法执行前后执行自定义逻辑,因此可能会对性能产生影响。在性能敏感的应用中,应谨慎使用。

pan_junbiao的博客 970

SpringBoot基于Aop实现自定义日志注解(提供Gitee源码)

日志在我们的日常开发当中是必定会用到的,在每个方法的上都会习惯性打上@Log注解,这样系统就会自动帮我们记录日志,整体的代码结构就会非常优雅,这边我自己搭建了一个demo去实现了一些这个项目当中必定会用的功能。

黄团团的个人博客 2286

SAP MM新手避坑指南:工厂间调拨用301还是303?手把手教你选对移动类型

本文深入解析SAP MM模块中工厂间调拨的301与303移动类型,帮助新手避开常见陷阱。通过对比一步法(301)和两步法(303+305)的核心差异、适用场景及财务影响,提供清晰的决策框架和实战技巧,确保库存调拨的准确性和效率。

weixin_29223603的博客 351

更多 LSTM 变种——应用于 CMAPSS 数据集

本文并模型介绍,只是把一些比较火的技术,像双向注意力机制,自注意力机制这样的比较火的内容,简单的和LSTM堆叠,结果发现效果都不如最基础的,这里作者将本人代码及实现结果,进行展示,给各位想更改LSTM的朋友一些。

2301_77491330的博客 1766

【顾邦小讲堂】第二十四期 电源环路测试从入门到精髓:一文掌握环路测试原理与电压注入点选择依据

电源环路测试是评估开关电源、线性电源等闭环系统稳定性的核心手段,直接关系到电源的稳定性、输出精度、动态响应、抗干扰能力甚至可靠性

GBupupup的博客 2122

单细胞专题(1) | 单细胞转录组研究样本准备指南(上)

单细胞RNA测序(scRNA-seq)是目前最前沿,能进行大规模实验的转录组研究技术,为理解细胞组成和动态生物学过程提供了很多新的见解。单细胞研究已经为我们理解发育过程,老化和疾病(如癌症)等提供了大量数据。在这里,小编主要就前期的样本准备与保存需注意问题给大家进行讲解,以备大家在不同的研究场景和研究背景下,走好单细胞转录组学研究的第一步。

bioyigene的博客 4232

模拟电子课设-半导体直流稳压电源的设计和测试

1、学习直流稳压电源的设计方法; 2、研究直流稳压电源的设计方案; 3、掌握直流稳压电路的调试及主要指标的测试方法。二、设计要求和技术指标 1、设计要求1)、设计一个能输出5V-12V连续可调的直流稳压电源,或±12V的直流稳压电源; 2)、根据设计要求和技术指标设计好电路,选好元件及参数,要求绘出原理图,并用Protel 99SE/DXP画出印制板图; 3)、在万能板或面包板上制作一台直流稳压电源; 4)、测量直流稳压电源的稳压系数; 5)、测量直流稳压电源的内阻; 6)、拟定测试方案和设计步

GJZGRB的博客 1973

SAP PP实战:MRP Area怎么用?手把手教你按产线、委外供应商拆分物料计划

本文详细解析了SAP PP模块中MRP Area的功能与应用,指导如何按产线、委外供应商拆分物料计划,实现精细化物料需求管理。通过实战案例展示MRP Area在减少计划冲突、提升库存准确率方面的显著效果,为制造业企业提供可落地的解决方案。

weixin_27015733的博客 432

使用强化学习快速让AI学会玩贪食蛇游戏(轻量级二十分钟训练+代码)

如何让AI玩会贪食蛇,甚至比你厉害概述构建问题(强化学习求解的一般步骤)环境动作定义状态定义奖励设计训练奖励值收敛图效果代码 概述 所用技术:强化学习(Deep Reinforcement Learning),属于一种无监督学习,利用奖励rewardrewardreward教会智能体AgentAgentAgent在合适的场景做合适的决策。 采用算法:试过两种算法D3QN和离散版本的PPO算法,最终采用离散版本PPO算法+GAE(PPO是我用过的性能最好的算法之一) 编程语言与深度学习框架:Python3.

ZYunfei的博客 2万+

SAP_MM模块库存概览俄罗斯报表简介

本文介绍了SAP MM模块中"库存概览俄罗斯报表"的功能与应用。该报表主要用于查看物料在不同库存地点和类型的库存情况,并满足俄罗斯当地法规要求。文章解释了"俄罗斯报表"可能指代本地化合规库存报表或客户自定义报表,详细说明了事务代码J3RFLVMOBVEDH的操作步骤,包括公司代码、物料编码、日期范围等查询条件,并解释了报表中各字段含义如期初期末库存数量与价值。最后强调在物料分类账处理完成后使用该报表可获得实际库存价值,为SAP用户提供了实用的库存管理参考。

我小时候很黑的博客 1092

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

上一篇: 为啥Java应用迁移到容器后会出现OOM?
下一篇: 不止代码,还有思维
Java在我心中永远的神
博客等级 码龄6年 1535粉丝 111原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值