SpringBoot中通过注解优雅记录操作日志

开发 架构
本文介绍一种SpingBoot系统操作记录的实现方法,主要解决谁在什么时间对什么做了什么事。


前言

本文介绍一种SpingBoot系统操作记录的实现方法,主要解决谁在什么时间对什么做了什么事。

准备

1、添加依赖

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

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

@EnableLogRecord(tenant = "com.zhangls.log")
@SpringBootApplication
public class LogApplication {
public static void main(String[] args) {
SpringApplication.run(LogApplication.class, args);
}
}

3、@LogRecord注解说明

  • type:是拼接在 bizNo 上作为 log 的一个标识,日志的主分类
  • subType:日志的二级
  • bizNo:日志的流水号。
  • success:方法调用成功后把 success 记录在日志的内容中
  • fail:方法调用失败后把 fail记录在日志的内容中
  • SpEL 表达式:其中用双大括号包围起来的(例如:{{#browseRecord.username}})#browseRecord.username 是 SpEL表达式。Spring中支持的它都支持的。比如调用静态方法,三目表达式。SpEL 可以使用方法中的任何参数

实现

1、打印调用成功日志

@LogRecord(
subType = "开发文章浏览",
extra = "{{#browseRecord.toString()}}",
success = "{{#browseRecord.username}}查看了「{{#browseRecord.articleTitle}}」,结果:{{#_ret}}",
type = "scan",
bizNo = "{{#browseRecord.articleId}}")
public boolean success(BrowseRecord browseRecord) {
return true;
}

调用参数:

日志输出:

【logRecord】log=LogRecord(id=null, tenant=com.zhangls.log, type=scan, subType=开发文章浏览, bizNo=9999, operator=111, actinotallow=九天银河聊编程查看了「JAVA技术揭秘」,结果:true, fail=false, createTime=Mon Mar 06 10:41:25 CST 2023, extra=BrowseRecord(username=九天银河聊编程, articleId=9999, articleTitle=JAVA技术揭秘), codeVariable={ClassName=interface
com.zhangls.log.service.LogService, MethodName=success})

2、打印调用失败日志

@LogRecord(
fail = "浏览失败,失败原因:「{{#_errorMsg}}」",
subType = "开发文章浏览",
extra = "{{#browseRecord.toString()}}",
success = "{{#browseRecord.username}}查看了「{{#browseRecord.articleTitle}}」,结果:{{#_ret}}",
type = "scan",
bizNo = "{{#browseRecord.articleId}}")
public boolean fail(BrowseRecord browseRecord) {
int tmp = 1 / 0;
return false;
}

调用参数:

日志输出:

【logRecord】log=LogRecord(id=null, tenant=com.zhangls.log, type=scan, subType=开发文章浏览, bizNo=9999, operator=111, actinotallow=浏览失败,失败原因:「/ by zero」, fail=true, createTime=Mon Mar 06 10:48:34 CST 2023, extra=BrowseRecord(username=九天银河聊编程, articleId=9999, articleTitle=JAVA技术揭秘), codeVariable={ClassName=interface
com.zhangls.log.service.LogService, MethodName=fail})

当然也有一个报错信息:

3、操作差异记录

开发记录函数

@Component("diff")
public class DiffParseFunction implements IParseFunction {
@Override
public boolean executeBefore() {
return true;
}//设置在执行前记录
@Override
public String functionName() {
return "DIFF";
}
@Override
public String apply(Object value) {
if (StringUtils.isEmpty(value)) {
return "";
}
return "".concat("(").concat(value.toString()).concat(")");
}
}

日志部分代码

@Override
@LogRecord(success = "更新前{DIFF{#browseRecord}},更新后{{#browseRecord}}",
type = "scan",
bizNo = "{{#browseRecord.articleId}}")
public boolean diff(BrowseRecord browseRecord) {
browseRecord.setArticleTitle("C#技术揭秘");
return true;
}

调用

日志输出:

【logRecord】log=LogRecord(id=null, tenant=com.zhangls.log, type=scan, subType=, bizNo=9999, operator=111, actinotallow=更新前(BrowseRecord(username=九天银河聊编程, articleId=9999, articleTitle=JAVA技术揭秘)),更新后BrowseRecord(username=九天银河聊编程, articleId=9999, articleTitle=C#技术揭秘), fail=false, createTime=Mon Mar 06 10:55:14 CST 2023, extra=, codeVariable={ClassName=interface
com.zhangls.log.service.LogService, MethodName=diff})

4、日志记录保存数据

根据com.mzt.logapi.beans.LogRecord创建数据库表结构,生成实体、mapper、XML文件,此过程略。

编写日志保存服务类。

@Service
public class LogRecordServiceImpl implements ILogRecordService {
@Resource
private TLogrecordMapper logRecordMapper;
@Override
public void record(LogRecord logRecord) {
TLogrecord record = new TLogrecord();
BeanUtils.copyProperties(logRecord, record);
logRecordMapper.insert(record);
}
@Override
public List<LogRecord> queryLog(String bizNo, String type) {
return null;
}
@Override
public List<LogRecord> queryLogByBizNo(String bizNo, String type, String subType) {
return null;
}
}

代码实现

@Override
@LogRecord(
fail = "失败原因:「{{#_errorMsg}}」",
subType = "开发文章浏览",
operator = "admin",
extra = "{{#browseRecord.toString()}}",
success = "{{#browseRecord.username}}查看了「{{#browseRecord.articleTitle}}」,结果:{{#_ret}}",
type = "scan",
bizNo = "{{#browseRecord.articleId}}")
public boolean saveDb(BrowseRecord browseRecord) {
return true;
}

控制台输出:

数据库记录:

责任编辑:姜华 来源: 今日头条
相关推荐

2024-09-02 00:27:51

SpringAOP自定义

2022-06-14 10:47:27

项目日志PUT

2021-11-10 10:03:18

SpringBootJava代码

2022-02-15 17:56:19

SpringBoot日志

2024-01-04 07:55:32

系统操作日志接口

2020-09-08 08:44:36

日志记录基础设施安全漏洞

2024-09-27 12:27:31

2023-03-23 22:46:38

Spring限流机制

2023-12-20 13:50:00

SpringBootJSON序列化

2021-11-17 10:25:28

loguru日志Python

2020-09-24 10:00:50

SpringBoo

2023-06-28 08:25:14

事务SQL语句

2023-01-30 07:41:43

2023-09-04 08:12:16

分布式锁Springboot

2024-05-29 08:12:55

接口参数格式

2022-03-24 07:38:07

注解SpringBoot项目

2023-04-17 23:49:09

开发代码Java

2024-10-18 08:53:49

SpringMybatis微服务

2024-03-18 14:06:00

停机Spring服务器

2023-08-21 08:01:03

点赞
收藏

51CTO技术栈公众号