首页>国内 > 正文

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

2023-03-06 14:16:49来源:今日头条


(相关资料图)

前言

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

准备1、添加依赖
    io.github.mouzt    bizlog-sdk    3.0.0
2、SpringBoot入口打开开关,添加 @EnableLogRecord 注解
@EnableLogRecord(tenant = "com.zhangls.log")@SpringBootApplicationpublic 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=interfacecom.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=interfacecom.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=interfacecom.zhangls.log.service.LogService, MethodName=diff})

4、日志记录保存数据

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

编写日志保存服务类。

@Servicepublic 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 queryLog(String bizNo, String type) {        return null;    }    @Override    public List 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;}
控制台输出:数据库记录:

关键词: 可以使用 静态方法 操作记录

相关新闻

Copyright 2015-2020   三好网  版权所有 联系邮箱:435 22 640@qq.com  备案号: 京ICP备2022022245号-21