最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot3實(shí)戰(zhàn)集成mzt-biz-log實(shí)現(xiàn)日志記錄

 更新時(shí)間:2026年04月05日 10:15:22   作者:碼路星河  
本文主要介紹了SpringBoot3實(shí)戰(zhàn)集成mzt-biz-log實(shí)現(xiàn)日志記錄,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

作為后端開(kāi)發(fā)者,業(yè)務(wù)日志是線上問(wèn)題排查、操作追溯和審計(jì)留痕的核心抓手。手寫業(yè)務(wù)日志不僅重復(fù)代碼量大,還容易出現(xiàn)記錄不規(guī)范、關(guān)鍵信息漏記錯(cuò)記的問(wèn)題,排查線上問(wèn)題時(shí)往往效率極低。

最近我在SpringBoot3項(xiàng)目中接入了mzt-biz-log這款輕量業(yè)務(wù)日志框架,徹底擺脫了手寫日志的繁瑣,注解式配置就能精準(zhǔn)記錄操作人、業(yè)務(wù)內(nèi)容、變更前后數(shù)據(jù)和業(yè)務(wù)主鍵等核心信息,全程無(wú)侵入、易擴(kuò)展。本篇全是實(shí)打?qū)嵉穆涞夭襟E,不扯多余理論,跟著一步步做就能直接跑通。

一、環(huán)境準(zhǔn)備

技術(shù)集成優(yōu)先保證版本適配,本次采用穩(wěn)定對(duì)齊的固定環(huán)境,直接照搬就能規(guī)避所有兼容問(wèn)題,具體配置如下:

  • JDK 17+
  • SpringBoot 3.2.5
  • Maven 3.8.6+
  • mzt-biz-log 3.0.6

二、引入Maven核心依賴

在項(xiàng)目pom.xml中添加框架核心依賴,這款框架本身輕量無(wú)冗余依賴,不會(huì)增加項(xiàng)目包體積,搭配日常通用工具包即可正常使用。

<!-- 定義bizlog-sdk版本號(hào),推薦在pom.xml properties節(jié)點(diǎn)統(tǒng)一管理 -->
<properties>
    <bizlog-sdk.version>3.0.6</bizlog-sdk.version>
</properties>
 
<!-- mzt-biz-log 正確核心依賴,適配SpringBoot 3.2.5 -->
<dependency>
    <groupId>io.github.mouzt</groupId>
    <artifactId>bizlog-sdk</artifactId>
    <version>${bizlog-sdk.version}</version>
</dependency>

依賴引入后刷新Maven,確保所有依賴下載完成;如果中央倉(cāng)庫(kù)下載緩慢,直接切換阿里云鏡像就能加速。

三、核心配置實(shí)現(xiàn)

mzt-biz-log核心配置分為操作人獲取和日志持久化兩部分,框架不限制日志存儲(chǔ)介質(zhì),支持?jǐn)?shù)據(jù)庫(kù)、ES、MongoDB等多種落地方式,日常開(kāi)發(fā)優(yōu)先存入業(yè)務(wù)日志表。

3.1 自定義操作人獲取類

框架無(wú)法自動(dòng)獲取登錄用戶信息,需要自定義實(shí)現(xiàn)操作人獲取接口,從項(xiàng)目登錄上下文、Token解析或者ThreadLocal中獲取當(dāng)前操作人,這段代碼可以直接適配項(xiàng)目登錄體系復(fù)用。

import com.mzt.logapi.beans.Operator;
import com.mzt.logapi.service.IOperatorGetService;
import org.springframework.stereotype.Component;
 
@Component
public class CustomOperatorGetService implements IOperatorGetService {
 
    @Override
    public Operator getUser() {
        // 替換為項(xiàng)目真實(shí)獲取登錄用戶邏輯
        // 示例:return UserContext.getCurrentUser().getUsername();
        // 測(cè)試階段可暫用固定值,上線后對(duì)接登錄體系
        return new Operator("admin");
    }
}

3.2 自定義日志持久化處理器

實(shí)現(xiàn)框架日志記錄接口,重寫核心保存方法,調(diào)試階段可以先打印控制臺(tái)日志,方便查看效果;正式環(huán)境直接對(duì)接數(shù)據(jù)庫(kù)Mapper,將日志存入業(yè)務(wù)日志表,全程不侵入任何業(yè)務(wù)代碼。

import com.mzt.logapi.beans.LogRecord;
import com.mzt.logapi.service.ILogRecordService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.List;
 
@Slf4j
@Component
public class CustomLogRecordService implements ILogRecordService {
 
    /**
     * 日志核心保存方法
     */
    @Override
    public void record(LogRecord logRecord) {
        // 調(diào)試階段:控制臺(tái)打印日志
        log.info("=====================業(yè)務(wù)日志=====================");
        log.info("操作人:{}", logRecord.getOperator());
        log.info("業(yè)務(wù)類型:{}", logRecord.getType());
        log.info("業(yè)務(wù)ID:{}", logRecord.getBizNo());
        log.info("操作內(nèi)容:{}", logRecord.getAction());
        log.info("操作時(shí)間:{}", logRecord.getCreateTime());
        log.info("==================================================");
 
        // 生產(chǎn)環(huán)境:對(duì)接數(shù)據(jù)庫(kù),實(shí)現(xiàn)日志入庫(kù)
        // BizLogEntity logEntity = buildLogEntity(logRecord);
        // bizLogMapper.insert(logEntity);
    }
 
    @Override
    public List<LogRecord> queryLog(String bizNo, String type) {
        return List.of();
    }
 
    @Override
    public List<LogRecord> queryLogByBizNo(String bizNo, String type, String subType) {
        return List.of();
    }
}

3.3 開(kāi)啟日志注解功能

在SpringBoot啟動(dòng)類上添加開(kāi)啟注解,激活框架的日志記錄功能,這一步絕對(duì)不能省略,否則注解會(huì)完全不生效。

import com.mzt.logapi.starter.annotation.EnableLogRecord;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
 
@SpringBootApplication
@EnableLogRecord(tenant = "")
public class Springboot3BizLogApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(Springboot3BizLogApplication.class, args);
    }
}

至此,核心配置全部完成,沒(méi)有繁瑣的YAML配置,整體結(jié)構(gòu)清晰,后續(xù)擴(kuò)展和修改都很方便,也不會(huì)對(duì)原有業(yè)務(wù)代碼造成任何影響。

四、業(yè)務(wù)代碼接入實(shí)戰(zhàn)

配置完成后,直接通過(guò)注解就能實(shí)現(xiàn)日志自動(dòng)記錄,框架支持SpEL表達(dá)式,可動(dòng)態(tài)獲取方法入?yún)?、業(yè)務(wù)數(shù)據(jù),靈活記錄各類操作詳情。接下來(lái)以用戶管理模塊為例,演示編輯、刪除場(chǎng)景的日志接入方式,覆蓋日常開(kāi)發(fā)核心業(yè)務(wù)場(chǎng)景。

4.1 準(zhǔn)備業(yè)務(wù)實(shí)體類

先創(chuàng)建基礎(chǔ)的用戶實(shí)體類,模擬業(yè)務(wù)數(shù)據(jù)對(duì)象,用于后續(xù)日志記錄測(cè)試。

import lombok.Data;
 
@Data
public class UserInfo {
    private Long userId;
    private String username;
    private String phone;
    private Integer age;
}

4.2 注解實(shí)現(xiàn)業(yè)務(wù)日志記錄

在業(yè)務(wù)實(shí)現(xiàn)類的方法上添加日志注解,框架會(huì)在方法執(zhí)行成功后自動(dòng)記錄日志,異常場(chǎng)景不記錄,完全符合日常業(yè)務(wù)日志的記錄邏輯。針對(duì)數(shù)據(jù)修改場(chǎng)景,可以通過(guò)框架上下文存入舊數(shù)據(jù),實(shí)現(xiàn)變更前后的對(duì)比記錄。

import com.example.bizlogdemo.entity.UserInfo;
 
/**
 * 用戶服務(wù)接口
 * 提供用戶信息的更新和刪除操作
 */
public interface UserService {
 
    /**
     * 更新用戶信息
     * <p>
     * 根據(jù)傳入的用戶信息對(duì)象,更新對(duì)應(yīng)用戶的數(shù)據(jù),包括用戶名、手機(jī)號(hào)、年齡等信息
     * </p>
     *
     * @param user 包含更新信息的用戶對(duì)象,必須包含有效的 userId
     * @return 更新成功返回 true,失敗返回 false
     */
    boolean updateUser(UserInfo user);
 
    /**
     * 刪除用戶
     * <p>
     * 根據(jù)用戶 ID 刪除對(duì)應(yīng)的用戶信息
     * </p>
     *
     * @param userId 要?jiǎng)h除的用戶 ID
     * @return 刪除成功返回 true,失敗返回 false
     */
    boolean deleteUser(Long userId);
}
import com.example.bizlogdemo.entity.UserInfo;
import com.mzt.logapi.context.LogRecordContext;
import com.mzt.logapi.starter.annotation.LogRecord;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
 
@Service
@Slf4j
public class UserServiceImpl implements UserService {
    /**
     * 編輯用戶信息,記錄變更前后數(shù)據(jù)
     */
    @Override
    @LogRecord(
            bizNo = "{{#user.userId}}",
            success = "編輯用戶信息,用戶ID:{{#user.userId}},修改前用戶名:{{#oldUser.username}},修改后用戶名:{{#user.username}},修改前手機(jī)號(hào):{{#oldUser.phone}},修改后手機(jī)號(hào):{{#user.phone}}",
            type = "user"
    )
    public boolean updateUser(UserInfo user) {
        // 查詢數(shù)據(jù)庫(kù)舊數(shù)據(jù)
        UserInfo oldUser = getUserById(user.getUserId());
        log.info("執(zhí)行用戶更新操作,用戶ID:{}", user.getUserId());
        // 舊數(shù)據(jù)存入上下文,供日志注解讀取
        LogRecordContext.putVariable("oldUser", oldUser);
        return true;
    }
 
    /**
     * 刪除用戶,記錄刪除操作
     */
    @Override
    @LogRecord(
            bizNo = "{{#userId}}",
            success = "刪除用戶,用戶ID:{{#userId}}",
            type = "user"
    )
    public boolean deleteUser(Long userId) {
        log.info("執(zhí)行用戶刪除操作,用戶ID:{}", userId);
        return true;
    }
 
    /**
     * 模擬根據(jù)ID查詢用戶舊數(shù)據(jù)
     */
    private UserInfo getUserById(Long userId) {
        UserInfo oldUser = new UserInfo();
        oldUser.setUserId(userId);
        oldUser.setUsername("測(cè)試用戶");
        oldUser.setPhone("13800138000");
        oldUser.setAge(20);
        return oldUser;
    }
}

實(shí)戰(zhàn)小貼士:數(shù)據(jù)修改場(chǎng)景,通過(guò)LogRecordContext.putVariable()存入舊數(shù)據(jù),即可在注解中通過(guò)SpEL表達(dá)式調(diào)用,實(shí)現(xiàn)變更對(duì)比記錄;新增場(chǎng)景直接記錄業(yè)務(wù)內(nèi)容,bizNo使用生成后的主鍵即可。

五、接口測(cè)試與日志驗(yàn)證

編寫控制層接口,調(diào)用業(yè)務(wù)層方法,測(cè)試日志是否正常記錄,確認(rèn)整體集成效果。為了方便測(cè)試,控制層接口我集成了knife4J直接生成接口文檔。

import com.example.shardingspheredemo.entity.UserInfo;
import com.example.shardingspheredemo.service.UserService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.*;
 
@RestController
@RequestMapping("/user")
@Tag(name = "用戶管理接口", description = "用戶增刪改查接口")
public class UserController {
 
    @Resource
    private UserService userService;
 
    @PostMapping("/update")
    @Operation(summary = "更新用戶", description = "傳入用戶信息,返回用戶ID")
    @ApiResponse(responseCode = "200", description = "新增成功", content = @Content(schema = @Schema(implementation = String.class)))
    public String updateUser(@RequestBody UserInfo user) {
        boolean result = userService.updateUser(user);
        return result ? "修改成功" : "修改失敗";
    }
 
    @GetMapping("/delete/{userId}")
    @Operation(summary = "根據(jù)ID刪除用戶", description = "傳入用戶ID,刪除用戶數(shù)據(jù)")
    public String deleteUser(@PathVariable Long userId) {
        boolean result = userService.deleteUser(userId);
        return result ? "刪除成功" : "刪除失敗";
    }
}

5.1 接口實(shí)測(cè)

1. 用戶編輯接口測(cè)試

測(cè)試請(qǐng)求地址及參數(shù)如下:

測(cè)試結(jié)果(日志打?。┤缦拢?/p>

2. 用戶刪除接口測(cè)試

測(cè)試請(qǐng)求地址及參數(shù)如下:

測(cè)試結(jié)果(日志打?。┤缦拢?/p>

六、實(shí)戰(zhàn)擴(kuò)展思路

  • 敏感數(shù)據(jù)脫敏:針對(duì)手機(jī)號(hào)、身份證號(hào)等敏感信息,自定義脫敏規(guī)則,在日志記錄前完成處理
  • 異步日志記錄:使用@Async實(shí)現(xiàn)異步保存日志,避免日志記錄影響業(yè)務(wù)接口性能
  • 異常日志記錄:結(jié)合全局異常處理器,記錄操作失敗日志,完善全流程操作追溯
  • 批量業(yè)務(wù)日志:框架支持批量操作場(chǎng)景,循環(huán)遍歷業(yè)務(wù)邏輯,注解依舊正常生效

七、總結(jié)

mzt-biz-log 輕量無(wú)侵入,穩(wěn)定性強(qiáng),注解式開(kāi)發(fā)徹底告別手寫日志代碼,實(shí)現(xiàn)業(yè)務(wù)邏輯與日志記錄完全解耦,日志記錄規(guī)范統(tǒng)一,大幅提升線上問(wèn)題排查和操作審計(jì)效率。單體應(yīng)用和微服務(wù)項(xiàng)目均可快速接入,尤其適合管理后臺(tái)、電商等需要完善操作追溯的業(yè)務(wù)系統(tǒng)??梢韵仍跍y(cè)試項(xiàng)目調(diào)試落地,確認(rèn)無(wú)誤后直接遷移至正式項(xiàng)目,整體接入成本極低。使用過(guò)程中有什么問(wèn)題歡迎在評(píng)論區(qū)留言討論。

到此這篇關(guān)于SpringBoot3實(shí)戰(zhàn)集成mzt-biz-log實(shí)現(xiàn)日志記錄的文章就介紹到這了,更多相關(guān)SpringBoot3集成mzt-biz-log內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • spring框架下@value注解屬性static無(wú)法獲取值問(wèn)題

    spring框架下@value注解屬性static無(wú)法獲取值問(wèn)題

    這篇文章主要介紹了spring框架下@value注解屬性static無(wú)法獲取值問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java數(shù)據(jù)類型、運(yùn)算符和方法重點(diǎn)總結(jié)大全

    Java數(shù)據(jù)類型、運(yùn)算符和方法重點(diǎn)總結(jié)大全

    在大學(xué)Java編程課程中,數(shù)據(jù)類型和運(yùn)算符是構(gòu)建程序設(shè)計(jì)邏輯的基石,這篇文章主要介紹了Java數(shù)據(jù)類型、運(yùn)算符和方法重點(diǎn)總結(jié)的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2026-02-02
  • 學(xué)習(xí)Java HashMap,看這篇就夠了

    學(xué)習(xí)Java HashMap,看這篇就夠了

    這篇文章主要介紹了Java HashMap的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • Java中字符串常見(jiàn)題之String相關(guān)講解

    Java中字符串常見(jiàn)題之String相關(guān)講解

    今天小編就為大家分享一篇關(guān)于Java中字符串常見(jiàn)題之String相關(guān)講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • 分析ZooKeeper分布式鎖的實(shí)現(xiàn)

    分析ZooKeeper分布式鎖的實(shí)現(xiàn)

    在分布式的情況下,sychornized 和 Lock 已經(jīng)不能滿足我們的要求了,那么就需要使用第三方的鎖了,這里我們就使用 ZooKeeper 來(lái)實(shí)現(xiàn)一個(gè)分布式鎖
    2021-06-06
  • Spring Event觀察者模式事件監(jiān)聽(tīng)詳解

    Spring Event觀察者模式事件監(jiān)聽(tīng)詳解

    這篇文章主要介紹了Java Spring Event事件監(jiān)聽(tīng)詳情解析,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • RocketMQ的順序消費(fèi)機(jī)制詳解

    RocketMQ的順序消費(fèi)機(jī)制詳解

    這篇文章主要介紹了RocketMQ的順序消費(fèi)機(jī)制詳解,順序消息是指對(duì)于一個(gè)指定的?Topic?,消息嚴(yán)格按照先進(jìn)先出(FIFO)的原則進(jìn)行消息發(fā)布和消費(fèi),即先發(fā)布的消息先消費(fèi),后發(fā)布的消息后消費(fèi),,需要的朋友可以參考下
    2023-10-10
  • Java中Iterator迭代器的簡(jiǎn)單理解

    Java中Iterator迭代器的簡(jiǎn)單理解

    這篇文章主要介紹了Java中Iterator迭代器的簡(jiǎn)單理解,Iterator接口也是Java集合中的一員,但它與Collection、Map接口有所不同,Iterator主要用于迭代訪問(wèn)Collection中的元素,因此Iterator對(duì)象也被稱為迭代器,需要的朋友可以參考下
    2024-01-01
  • springboot項(xiàng)目中使用JOSN解析庫(kù)的方法

    springboot項(xiàng)目中使用JOSN解析庫(kù)的方法

    JSON,全程是JavaScript Object Notation,是一種輕量級(jí)的數(shù)據(jù)交換格式,本文給大家介紹springboot項(xiàng)目中使用JOSN解析庫(kù)的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2025-06-06
  • Java?C++題解leetcode817鏈表組件示例

    Java?C++題解leetcode817鏈表組件示例

    這篇文章主要為大家介紹了Java?C++題解leetcode817鏈表組件示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10

最新評(píng)論

太康县| 湖南省| 临汾市| 沾益县| 依兰县| 剑川县| 定陶县| 诸暨市| 小金县| 焉耆| 都兰县| 塔城市| 赤水市| 泽库县| 饶河县| 全州县| 望江县| 苍梧县| 凤台县| 香格里拉县| 银川市| 青阳县| 眉山市| 玉田县| 黔南| 宜城市| 稷山县| 太仆寺旗| 封开县| 刚察县| 乐业县| 紫阳县| 汨罗市| 竹北市| 乃东县| 长岛县| 金溪县| 崇文区| 海晏县| 泰兴市| 循化|