爽!一个注解,搞定 SpringBoot 操作日志

2023-11-16

来源:blog.csdn.net/weixin_43954303/article/details/113781801
使用方式
基本使用
源码
此组件解决的问题是:「谁」在「什么时间」对「什么」做了「什么事」
本组件目前针对 Spring-boot 做了 Autoconfig,如果是 SpringMVC,也可自己在 xml 初始化 bean
使用方式

基本使用

maven依赖添加SDK依赖
        <dependency>
            <groupId>io.github.mouzt</groupId>
            <artifactId>bizlog-sdk</artifactId>
            <version>1.0.1</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. 日志支持种类
比如一个订单的操作日志,有些操作日志是用户自己操作的,有些操作是系统运营人员做了修改产生的操作日志,我们系统不希望把运营的操作日志暴露给用户看到, 但是运营期望可以看到用户的日志以及运营自己操作的日志,这些操作日志的bizNo都是订单号,所以为了扩展添加了类型字段,主要是为了对日志做分类,查询方便,支持更多的业务。

@LogRecordAnnotation(
fail = “创建订单失败,失败原因:「{ {#_errorMsg}}」”,
category = “MANAGER”,
success = “{ {#order.pu

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

爽!一个注解,搞定 SpringBoot 操作日志 的相关文章

  • Apache HttpClient 执行时会在所有 HTTP 5XX 错误上抛出 IOException 吗?

    The Apache HttpClient 文档 http hc apache org httpcomponents client ga httpclient apidocs org apache http client HttpClien
  • Django - 电子邮件发送两次

    每当我使用如下所示的电子邮件设置从views py调用下面的方法时 电子邮件的两份副本都会发送给收件人 并且我收到如下所示的错误 def sendEmailBasic request msg EmailMessage Request Cal
  • 从 AlertDialog 返回值

    我想构建一个函数来创建 AlertDialog 并返回用户输入的字符串 这是我用于创建对话框的函数 如何返回该值 String m Text private String openDialog String title AlertDialo
  • 如何检查列表是否为空?

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 例如 如果通过以下内容 a 我如何检查是否a是空的 if not a print Lis
  • jsf 中的类型未找到属性

    我正在尝试调用 jsf 中使用 primefaces 的属性 但我有错误 500 在托管bean PersonelBean 类型上找不到 我正在使用 hibernate jsf 和 spring PersonelBean java Mana
  • 如何在 Python 中从 HTML 页面中提取 URL [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我必须用Python 编写一个网络爬
  • 为什么“return self”返回 None ? [复制]

    这个问题在这里已经有答案了 我正在尝试获取链的顶部节点getTopParent 当我打印出来时self name 它确实打印出了父实例的名称 然而 当我回来时self 它返回 None 为什么是这样 class A def init sel
  • 在同一台计算机上设置 JBoss 的多个实例

    我在 JBoss 社区中找到了下一页 http www jboss org community wiki ConfigurePorts http www jboss org community wiki ConfigurePorts 有下一
  • numpy.cov() 返回意外的输出

    我有一个 X 数据集 有 9 个特征和 683 行 683x9 我想获取这个 X 数据集和另一个与 X 具有相同形状的数据集的协方差矩阵 我使用np cov originalData generatedData rowvar False 代
  • 在 HttpClient4 中使用 PoolingHttpClientConnectionManager 的正确方法出现问题 java.lang.IllegalStateException: 连接池关闭

    我正在 Java 中利用 HTTPclient4 发送 HTTP 请求并处理 HTTP 响应 我想使用连接池来提高性能 但我无法找到合适的方法来做到这一点 我正在 Java 中利用 HTTPclient4 发送 HTTP 请求并处理 HTT
  • 为什么 bot.get_channel() 会产生 NoneType?

    我正在制作一个 Discord 机器人来处理公告命令 当使用该命令时 我希望机器人在特定通道中发送一条消息 并向用户发送一条消息以表明该命令已发送 但是 我无法将消息发送到频道 我尝试了这段代码 import discord import
  • servlet 如何获取 servlet 之外的文件的绝对路径?

    我们一直在使用 System getProperties user dir 来获取属性文件的位置 现在它已经部署在 Tomcat 上 通过 servlet 系统调用将位置指定为 tomcat 而不是属性文件所在的位置 我们如何动态调用属性文
  • JBoss 5 截断 base64 cookie 字符串的尾部 =

    从 JBoss 4 升级到 JBoss 5 后 我注意到最烦人的回归 它截断 base64 cookie 值的尾部等号 我花了很长时间才明白问题不是我的代码而是 JBoss 的 我用 google 搜索了一下 发现这是一个已知的问题issu
  • 使用 Tomcat 和 gradle 进行休眠

    免责声明 我是 Java 新手 我正在尝试使用 Tomcat 和 Gradle 设置 Hibernate 构建运行正确 但看起来像persistence xml文件未被读取 我的项目结构如下 build gradle src main ja
  • Web 应用程序似乎启动了名为 [22] 的线程,但未能停止它。这很可能造成内存泄漏

    我有一个 Web 应用程序 后端有 Servlet 部署在 tomcat 上 该应用程序是简单的java应用程序 我经常在服务器日志中看到此错误 严重 Web 应用程序似乎启动了一个名为 22 但未能阻止它 这很有可能 造成内存泄漏 是否存
  • Admob - 没有广告可显示

    你好 我尝试制作一些在 Android 手机上显示广告的示例程序 并尝试在 v2 2 的模拟器上测试它 代码中的一切似乎都很好 但调试器中的 AdListener 表示 响应消息为零或空 onFailedToReceiveAd 没有广告可显
  • 如何手动添加Android Studio依赖

    我多次尝试向我的项目添加依赖项 但每次都会出现错误 我想添加它们的依赖项是 de hdodenhof circleimageview 1 3 0 and com github bumptech glide glide 3 6 1 所以我想下
  • 如何使用Featuretools按列值从单个数据框中的多个列创建特征?

    我正在尝试根据之前的结果来预测足球比赛的结果 我在 Windows 上运行 Python 3 6 并使用 Featuretools 0 4 1 假设我有以下代表结果历史记录的数据框 原始数据框 https i stack imgur com
  • 在测试期间调用预定方法[重复]

    这个问题在这里已经有答案了 我正在使用 Maven 开发 SpringBoot 应用程序 我有一个班级 Component有方法的注释m与 Scheduled initialDelay 1000 fixedDelay 5000 注解 这里f
  • 生成签名和加密的 JWT

    我正在尝试使用生成签名和加密的 JWT 令牌雨云智威汤逊 http connect2id com products nimbus jose jwt private void generateToken throws JOSEExceptio

随机推荐

  • ResourceMgr 读取文件夹内容

    using System Collections using System Collections Generic using System IO using System using System Net using UnityEngin
  • 深度强化学习系列(6): DQN原理及实现

    利用神经网络近似值函数的方法表示为 V s w
  • Python @装饰器

    目录 目录 一 介绍 1 简单实现装饰器 普通调用 糖语法 2 进阶 普通调用 糖语法 3 装饰类 二 内置修饰器 一 介绍 装饰器 Decorators 是 Python 的一个重要部分 简单地说 他们是修改其他函数的功能的函数 与jav
  • 公司产品STM32 B错误排查分析

    近期原本好好的产品 突然上电不久MCU就卡住 调试发现跳到default handler错误 也就是B错误 根据网上获取的信息 有2个原因 1 没有相关中断 2 没清除标志 我看了下 串口2的中断函数USART2 IRQHandler已经有
  • 【MyBatis】进一步理解choose、when、otherwise标签

    choose when otherwise choose里面包含when otherwise两个标签 choose是父标签 when和otherwise必须都要写在它里面 当 when 中有条件满足的时候 就会跳出 choose 即所有的
  • 怎么修改csdn文本的字体样式

    示例 font face 仿宋 color FF0000 size 1 待修改语句 当前这句是字体大小为1的红色仿宋字体 font 以上的三个属性可选 其中 face 字体类型 如楷体 微软雅黑 仿宋等 color 字体颜色 十六进制的 s
  • IntelliJ IDEA的这个接口调试工具真是太好用了!

    你有一个思想 我有一个思想 我们交换后 一个人就有两个思想 If you can NOT explain it simply you do NOT understand it well enough 现陆续将Demo代码和技术文章整理在一起
  • mac虚拟摄像头插件_用于在macOS上从OBS的输出创建虚拟网络摄像头设备

    OBS macOS Virtual Camera Creates a virtual webcam device from the output of OBS Studio Especially useful for streaming s
  • HTML语言笔记(一)

    参考教程 HTML教程 1 简介 HTML是超文本标记语言 Hyper Text Markup Language 使用标记标签来描述网页 HTML 标签是由尖括号包围的关键词 比如 通常是成对出现的 Web的作用就是读取HTML文档 并以网
  • Pytorch/TensorFlow/Numpy常用函数汇总

    常用函数 一 Pytorch 1 枚举 enumerate 2 维度交换 permute 3 尺寸形状 size shape 4 数据填充 full fill 5 阻断反向梯度传播 detach 6 形状调整 view 7 维度扩张 减少
  • Windows 10 mvn不是内部或外部命令,也不是可运行的程序

    win10新装idea 使用mvn时提示mvn不是内部或外部命令 也不是可运行的程序 根据网上找到的方法如下设置 发现并没有什么用 可能是系统或则用户权限问题 直接删除了用户变量后在Path属性后面添加一条maven的地址 重启CMD后发现
  • 保留指定位数小数点的方法(五种)

    package feifan import java text DecimalFormat import java text NumberFormat public class YuoXiaoShuzi public static void
  • 从mpeg ts文件中提取I帧(5):I帧的解码

    找到含有I帧的pes后就可以对其进行解码 对I帧的解码我们使用ffmpeg 这里用到的版本是3 0 0 一 pes解码为yuv ffmpeg一般都是这个套路 直接上代码 int ffdecode pes uint8 t pes data i
  • 硬件十万个为什么

    1 电源类 1 1 电源基础 各种 地 各种 GND 板载电源设计规范 电源环路稳定性评价方法 深入芯片内部 理解去耦电容的作用 减小DC DC变换器中的接 地反弹 一些接地要点 开关电源中的小启示 电源相关的测试 去耦电容的选择 容值计算
  • 马上:纸币互动,智能笔数据点压缩

    马上 纸币互动 智能笔数据点压缩 对接一款智能笔 笔的数据是通过蓝牙传给app 但是笔的笔迹点数量很多 网络传输用json就不恰当 所以一番调研才起二进制压缩点 数字压缩基本原理 基本数据 class Dot implements Seri
  • Python-爬虫实现天气查询-有GUI界面

    Python用缩进来区分代码层次 代码的主体是爬虫与Tkinter 执行程序后会先出现一个选择城市的界面 这里需要输入城市名 点击确认即会出现城市天气状况 执行效果如下 完整代码如下 from tkinter import GUI设计 tk
  • .NET和Web 3.0

    Professional Visual Studio Extensibility 的作者Keyvan Nayyeri 在他的博客里头发表了 NET and Web 3 0 作为 NET社区的一个名人 他同时是 Professional Co
  • JLabel显示图片,及其它使用方法。。。实现九九乘法表

    JLabel的使用 显示九九乘法表 并使用JLabel载入背景图片 窗口大小固定public MyFrame extends JFrame public MyFrame String str JLabel jL setLayout null
  • 在Element-ui的table表格中,如何让分页的序号延续上一页的序号

    可以通过传递index属性来自定义索引 1 页面
  • 爽!一个注解,搞定 SpringBoot 操作日志

    来源 blog csdn net weixin 43954303 article details 113781801 使用方式 基本使用 源码 此组件解决的问题是 谁 在 什么时间 对 什么 做了 什么事 本组件目前针对 Spring bo