日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

100行代碼實現審計日志中間件

來源: 責編: 時間:2023-11-28 09:36:34 216觀看
導讀本文轉載自微信公眾號「小小平頭哥」,作者小小平頭哥。轉載本文請聯系小小平頭哥公眾號。審計日志管理是我們在web系統開發中的常見的模塊,雖然它有時并不屬于業務模塊的范疇,但對于系統整體來說卻十分關鍵,用戶的操作(尤

本文轉載自微信公眾號「小小平頭哥」,作者小小平頭哥。轉載本文請聯系小小平頭哥公眾號。JH928資訊網——每日最新資訊28at.com

審計日志管理是我們在web系統開發中的常見的模塊,雖然它有時并不屬于業務模塊的范疇,但對于系統整體來說卻十分關鍵,用戶的操作(尤其是關鍵操作)、用戶的登錄,我們的系統都應加以記錄,以便后續溯源。JH928資訊網——每日最新資訊28at.com

日志管理的方案可以看到很多,本文介紹的是一種基于Golang Gin框架的自定義中間件的實現方案,為大家拋磚引玉了。JH928資訊網——每日最新資訊28at.com

個人認為有以下幾個優勢:JH928資訊網——每日最新資訊28at.com

(1)中間件的方式可靈活地匹配路由組,從而靈活地指定需要記錄日志的路由組;JH928資訊網——每日最新資訊28at.com

(2)同一個路由組中通過context value 來區分接口是否需要記錄操作日志;JH928資訊網——每日最新資訊28at.com

(3)業務處理函數中可靈活配置需記錄內容,不需集中處理。JH928資訊網——每日最新資訊28at.com

本文轉載自微信公眾號「小小平頭哥」,作者小小平頭哥。轉載本文請聯系小小平頭哥公眾號。JH928資訊網——每日最新資訊28at.com

01整體流程

1) 中間件函數整體的流程

圖片圖片JH928資訊網——每日最新資訊28at.com

2) 業務函數流程

圖片圖片JH928資訊網——每日最新資訊28at.com

02代碼實現

1) 中間件函數實現

type Response struct {  Code int `json:"code" bson:"code"`}type bodyLogWriter struct {  gin.ResponseWriter  body *bytes.Buffer}func (w bodyLogWriter) Write(b []byte) (int, error) {  w.body.Write(b)  return w.ResponseWriter.Write(b)}const (  HttpRespSuccessCode = 0)// Logger 日志記錄func Logger() gin.HandlerFunc {  return func(c *gin.Context) {   //備份請求體    blw := &bodyLogWriter{body: bytes.NewBufferString(""), ResponseWriter: c.Writer}    c.Writer = blw    //繼續執行請求    c.Next()    //判斷記錄標志    needToLog, ok := c.Get("need_to_log")    if !ok {      log.Warn("獲取是否需要記錄日志失敗")      return    }    if !needToLog.(bool) {      return    }    //也可以在這兒加入白名單 判斷是否是不需記錄的URL    /*      url := c.Request.RequestURI      if strings.Index(url, "logout") > -1 ||        strings.Index(url, "login") > -1 {        return      }    */    // 獲取請求的HTTP狀態碼    statusCode := c.Writer.Status()    // 獲取請求IP    clientIP := common.GetClientIP(c)    isSuccess := false    //若HTTP狀態碼為200    if c.Writer.Status() == http.StatusOK {      var resp Response      // 獲取返回的數據      err := json.Unmarshal(blw.body.Bytes(), &resp)      if err != nil {        log.Warn("Logs Operation Unmarshal Error: %s", err.Error())        return      }      //判斷操作是否成功 需結合業務函數的返回值結構      if resp.Code == HttpRespSuccessCode {        isSuccess = true      }    }    if statusCode != http.StatusNotFound {      SetDBLog(c, clientIP, isSuccess)    }  }}// SetDBLog 寫入日志表func SetDBLog(c *gin.Context, clientIP string, status bool) {  user, ok := c.Get("user")  if !ok {    log.Warn("審計日志-獲取用戶名失敗")  }  //日志格式化 然后入庫  logInfo := table.Logs{}  //構造日志ID 可使用其他方式替代  logInfo.LogID = NewNanoid()  if user != nil {    logInfo.Username = user.(string)  }  operatorType, exist := c.Get("operation_type")  if exist {    logInfo.OperationType = operatorType.(string)  }  logInfo.IP = clientIP  operation, exist := c.Get("operation")  if exist {    logInfo.Description = operation.(string)  }  if status == true {    logInfo.Description = logInfo.Description + "成功"  } else {    logInfo.Description = logInfo.Description + "失敗"  }  //日志入庫  err := InsertLog(logInfo)  if err != nil {    log.Warn("InsertLog %s error, %s", logInfo.LogID, err.Error())  }}// InsertLog 插入logfunc InsertLog(logs table.Logs) error {}


JH928資訊網——每日最新資訊28at.com

2) 業務函數實現

func (User) UserLoginOut(c *ctx.Context) {  //設定記錄日志標志  c.Set("need_to_log", true)  //設定操作類型  c.Set("operation_type", "用戶退出登錄")  //設定具體操作  c.Set("operation", "用戶退出登錄")  c.Success()}

3) 路由組應用

//設定路由組  UserRouter := apiV1Group.Group("users")  //為路由組應用中間件  UserRouter.Use(middleware.Logger())


JH928資訊網——每日最新資訊28at.com

03注意事項

1) 中間件處理函數中的備份原始請求體很重要,否則可能會出現業務代碼無法獲取請求參數的情況;JH928資訊網——每日最新資訊28at.com

  1. 中間件的報錯不應影響原有業務邏輯。

原文鏈接:https://mp.weixin.qq.com/s/7HAVAAst5IyywLxdNdTQ5gJH928資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-34658-0.html100行代碼實現審計日志中間件

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Springboot擴展點之BeanDefinitionRegistryPostProcessor,你學會了嗎?

下一篇: 實現Eureka服務注冊和服務發現,你學會了嗎?

標簽:
  • 熱門焦點
  • 5月安卓手機好評榜:魅族20 Pro奪冠

    性能榜和性價比榜之后,我們來看最后的安卓手機好評榜,數據來源安兔兔評測,收集時間2023年5月1日至5月31日,僅限國內市場。第一名:魅族20 Pro好評率:97.50%不得不感慨魅族老品牌還
  • 如何通過Python線程池實現異步編程?

    線程池的概念和基本原理線程池是一種并發處理機制,它可以在程序啟動時創建一組線程,并將它們置于等待任務的狀態。當任務到達時,線程池中的某個線程會被喚醒并執行任務,執行完任
  • 使用AIGC工具提升安全工作效率

    在日常工作中,安全人員可能會涉及各種各樣的安全任務,包括但不限于:開發某些安全工具的插件,滿足自己特定的安全需求;自定義github搜索工具,快速查找所需的安全資料、漏洞poc、exp
  • 新電商三兄弟,“抖快紅”成團!

    來源:價值研究所作 者:Hernanderz 隨著內容電商的概念興起,抖音、快手、小紅書組成的“新電商三兄弟”成為業內一股不可忽視的勢力,給阿里、京東、拼多多帶去了巨大壓
  • 品牌洞察丨服務本地,美團直播成效幾何?

    來源:17PR7月11日,美團App首頁推薦位出現“美團直播”的固定入口。在直播聚合頁面,外賣“神槍手”直播間、美團旅行直播間、美團買菜直播間等均已上線,同時
  • 華為發布HarmonyOS 4:更好玩、更流暢、更安全

    在8月4日的華為開發者大會2023(HDC.Together)大會上,HarmonyOS 4正式發布。自2019年發布以來,HarmonyOS一直以用戶為中心,經歷四年多的發展HarmonyOS已
  • 國行版三星Galaxy Z Fold5/Z Flip5發布 售價7499元起

    2023年8月3日,三星電子舉行Galaxy新品中國發布會,正式在國內推出了新一代折疊屏智能手機三星Galaxy Z Fold5與Galaxy Z Flip5,以及三星Galaxy Tab S9
  • 質感不錯!OPPO K11渲染圖曝光:旗艦IMX890傳感器首次下放

    一直以來,OPPO K系列機型都保持著較為均衡的產品體驗,歷來都是2K價位的明星機型,去年推出的OPPO K10和OPPO K10 Pro兩款機型憑借各自的出色配置,堪稱有
  • 蘋果MacBook Pro 2021測試:仍不支持平滑滾動

    據10月30日9to5 Mac 消息報道,蘋果新的 14 英寸和 16 英寸 MacBook Pro 2021 上市后獲得了不錯的評價,亮點包括行業領先的性能,令人印象深刻的電池續航,精美豐
Top 主站蜘蛛池模板: 武强县| 丰都县| 溧阳市| 阿巴嘎旗| 佛学| 图片| 马边| 吴堡县| 黄石市| 孟村| 栖霞市| 樟树市| 肃北| 溧水县| 婺源县| 响水县| 潮安县| 扬州市| 娱乐| 高清| 吉木乃县| 金阳县| 庆元县| 铜陵市| 图木舒克市| 会泽县| 太和县| 开化县| 神农架林区| 兴和县| 色达县| 马龙县| 洱源县| 黄浦区| 当阳市| 怀宁县| 应城市| 车险| 铜山县| 黄梅县| 泗阳县|