天天看點

SpringBoot中通過注解優雅記錄記錄檔

作者:九天銀河聊程式設計

前言

本文介紹一種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;
}           

調用參數:

SpringBoot中通過注解優雅記錄記錄檔

日志輸出:

【logRecord】log=LogRecord(id=null, tenant=com.zhangls.log, type=scan, subType=開發文章浏覽, bizNo=9999, operator=111, action=九天銀河聊程式設計檢視了「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;
}           

調用參數:

SpringBoot中通過注解優雅記錄記錄檔

日志輸出:

【logRecord】log=LogRecord(id=null, tenant=com.zhangls.log, type=scan, subType=開發文章浏覽, bizNo=9999, operator=111, action=浏覽失敗,失敗原因:「/ 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})

當然也有一個報錯資訊:

SpringBoot中通過注解優雅記錄記錄檔
  1. 操作差異記錄

開發記錄函數

@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;
}           

調用

SpringBoot中通過注解優雅記錄記錄檔

日志輸出:

【logRecord】log=LogRecord(id=null, tenant=com.zhangls.log, type=scan, subType=, bizNo=9999, operator=111, action=更新前(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})

  1. 日志記錄儲存資料

根據com.mzt.logapi.beans.LogRecord建立資料庫表結構,生成實體、mapper、XML檔案,此過程略。

SpringBoot中通過注解優雅記錄記錄檔

編寫日志儲存服務類。

@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;
}           

控制台輸出:

SpringBoot中通過注解優雅記錄記錄檔

資料庫記錄:

SpringBoot中通過注解優雅記錄記錄檔

每天一個小知識,每天進步一點點!!![加油][加油][加油]