前言
本文介紹一種SpingBoot系統操作記錄的實作方法,主要解決誰在什麼時間對什麼做了什麼事。
準備
- 添加依賴
<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 可以使用方法中的任何參數
實作
- 列印調用成功日志
@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, 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;
}
調用參數:
日志輸出:
【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})
當然也有一個報錯資訊:
- 操作差異記錄
開發記錄函數
@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, 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})
- 日志記錄儲存資料
根據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;
}
控制台輸出:
資料庫記錄:
每天一個小知識,每天進步一點點!!![加油][加油][加油]