成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

三個實用細節,讓Zap在Go項目中變得更好用

開發 前端
日志文件Writer初始化并設置給Zap 后我們可以測試下是否有效果,我測試的時候是先把MaxSize 改成1 , 即最大1M,隨便寫個測試方法在里面寫日志,瘋狂刷了一會兒接口讓日志文件大小超過1M。

一個項目日志功能夠不夠健全、記錄的日志內容夠不夠有辨識度直接決定了一個項目維護的難度,你查日志是大海撈針一點點看,還是能夠靠一些有辨識度的索引篩選出用戶訪問程序期間留下的包含了完整上下文的日志直接決定了你搞明白“為什么會這樣”所耗費時間的多少。

從本節開始我們先用兩節為我們的Go項目定制日志組件,讓它足夠好用。

未來我們會用這個組件一步步完善項目的應用日志規范,讓項目框架能為我們把關鍵的上下文信息記錄到日志中,保證我們即使自己忘記打日志的情況下框架依然能為我們記錄下一些關鍵日志。

圖片圖片

本節項目的所有源碼和測試接口都單獨封存了Git版本, 方便大家在自己機器上快速調試和學習。

圖片圖片

安裝 Zap 和相關配置信息準備

Zap是Uber開源的Go日志組件,它的優勢什么的我就不過多介紹了,這兩節介紹的內容更多地是關注怎么給自己的項目框架定制一個比較好用日志組件,其中介紹的方法思路換做其他的Go開源日志組件也同樣適用

我們首先來安裝一下 Zap ,這個時候可以打開你自己新建的項目來跟著操作

go get go.uber.org/zap@v1.21.0

把日志寫入文件,同時完成日志文件的切割歸檔需要借助另外一個開源庫 lumberjack,我們把它也安裝一下

go get gopkg.in/natefinch/lumberjack.v2@v2.0.0

安裝完成后我們先添加幾個與日志相關的配置,好能通過配置控制日志文件的路徑和文件大小等選項

打開項目開發環境的配置文件 config/application.dev.yaml, 我們在app原配置基礎上,加了log相關的三個配置。

app:
  env: dev
  name: go-mall
  log:
    path: "/tmp/applog/go-mall.log"
    max_size: 100
    max_age: 60

這里注意一下,開發環境日志文件放在/tmp目錄下主要是為了避免在電腦上很多目錄的權限限制比較嚴格程序沒辦法寫日志的問題。測試環境和生存環境的日志文件路徑建議設置成 /home/applog/go-mall/go-mall.log 這樣的路徑。

配置文件加好后,相應的我們的配置對象也要根據新增配置進行調整。

type appConfig struct {
    Name string `mapstructure:"name"`
    Env  string `mapstructure:"env"`
    Log  struct {
        FilePath         string `mapstructure:"path"`
        FileMaxSize      int    `mapstructure:"max_size"`
        BackUpFileMaxAge int    `mapstructure:"max_age"`
    }
}

初始化日志組件

接下來我們先初始化Zap, 把它做為我們日志組件的基礎Logger,配置完后我們會在其上封裝一個門面,讓Logger 變得更好用一些,通過這個門面除了能簡化我們使用Zap打日志的操作方式外,還會給日志自動追加一些追蹤和定位信息便于我們追蹤日志和定位程序問題,這個下個章節再講,本節先把基礎的東西做好。

接下里,先在項目中新建一個 common 目錄

.
|-- common
|   |-- enum
|   |-- logger
|-- main.go
|-- go.mod
|-- go.sum

logger目錄中先新建 zap.go 在文件中對Zap進行初始化相關的操作。

func init() {
 encoderConfig := zap.NewProductionEncoderConfig()
 encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
 encoder := zapcore.NewJSONEncoder(encoderConfig)
 fileWriteSyncer := getFileLogWriter()

 var cores []zapcore.Core
    ......
 core := zapcore.NewTee(cores...)
 _logger = zap.New(core)
}

因為Zap我們只會把它當作基礎Logger,所以把它的變量定義成了只能在 logger 包內訪問的全局變量

var _logger *zap.Logger

我們都知道針對不同的運行環境,日志的最低級別不太一樣,比如說在開發環境中我們會打很多Debug日志,這個日志到生產環境上應該被自動過濾掉,如果不支持這個功能的話就得每次在代碼里把自己寫過的Debug日志的代碼行刪掉,這個相信誰都辦不到。

所以我們從底層Logger下手讓程序運行在服務器上時不收集Debug日志

var cores []zapcore.Core
 switch config.App.Env {
 case enum.ModeTest, enum.ModeProd:
  // 測試環境和生產環境的日志輸出到文件中
  cores = append(cores, zapcore.NewCore(encoder, fileWriteSyncer, zapcore.InfoLevel))
 case enum.ModeDev:
  // 開發環境同時向控制臺和文件輸出日志, Debug級別的日志也會被輸出
  cores = append(
   cores,
   zapcore.NewCore(encoder, zapcore.AddSync(os.Stdout), zapcore.DebugLevel),
   zapcore.NewCore(encoder, fileWriteSyncer, zapcore.DebugLevel),
  )

 }

通過上面這幾行代碼的設置讓 Zap 在開發環境中可以寫Debug級別的日志,并且除了向文件里寫日志外,還同時向終端控制臺寫日志,這樣我們打的日志就能出現在程序運行的控制臺中,方便我們快速Debug

日志文件的管理

Zap沒有自動管理和切割日志文件的功能,這個功能我們要借助 lumberjack 這個庫。

func getFileLogWriter() (writeSyncer zapcore.WriteSyncer) {
 // 使用 lumberjack 實現 logger rotate
 lumberJackLogger := &lumberjack.Logger{
  Filename:  config.App.Log.FilePath,
  MaxSize:   config.App.Log.FileMaxSize,      // 文件最大 100 M
  MaxAge:    config.App.Log.BackUpFileMaxAge, // 舊文件最多保留90天
  Compress:  false,
  LocalTime: true,
 }

 return zapcore.AddSync(lumberJackLogger)
}

創建 LumberJack 的 Logger 然后把它設置成 Zap 的 WriteSyncer ,這樣使用 Zap 打的日志就會寫到文件中

...
fileWriteSyncer := getFileLogWriter()

...
cores = append(cores, zapcore.NewCore(encoder, fileWriteSyncer, zapcore.InfoLevel))

創建LumberJack時可以定義日志文件的幾個選項

  • FileName 日志的路徑,這個dev環境我們使用的是/tmp/applog/go-mall.log 。測試和生產環境建議設置成/home/applog/{項目}/{項目}.log,一來存放在/tmp中可能會被系統清理,二來通過固定的目錄可以讓ELK的日志收集組件去固定目錄抽取日志文件把日志收集到統一的日志平臺。
  • MaxSize:單個日志文件的最大尺寸,上面配置里定義的是100 對應的尺寸是100M,日志文件達到這個大小后Lumber Jack會自動切割日志文件,把原來的日志保存到備份文件中
  • MaxAge:單位是天,設置60 就是備份文件最多保存60天

效果測試

日志文件Writer初始化并設置給Zap 后我們可以測試下是否有效果,我測試的時候是先把MaxSize 改成1 , 即最大1M,隨便寫個測試方法在里面寫日志,瘋狂刷了一會兒接口讓日志文件大小超過1M。

責任編輯:武曉燕 來源: 網管叨bi叨
相關推薦

2021-09-01 10:35:19

asyncawaitVue

2024-08-19 01:10:00

RedisGo代碼

2017-08-23 08:50:00

Safari瀏覽器擴展

2013-04-10 09:35:22

程序員

2015-05-18 09:50:23

swift擴展

2014-05-07 09:41:21

UbuntuTrusty Tahr

2022-05-31 08:53:29

Logger定制化Go

2011-05-10 16:27:55

網站優化SEO

2011-01-19 13:11:25

Zimbra白名單證書

2009-07-16 14:12:12

IT資產運維管理廣通信達

2022-02-21 08:15:15

Go項目語言

2021-01-14 22:13:03

人工智能教育互聯網

2022-06-07 10:06:16

Windows 11任務管理器

2011-09-05 14:26:43

PhoneGap插件

2010-08-24 09:10:14

Linux命令行工具

2023-06-26 08:06:39

重構代碼冗余

2011-07-07 17:08:55

PHP

2022-02-26 16:10:51

Figma設計工具

2022-02-14 10:42:41

移動端標簽設計用戶

2009-01-10 19:38:00

服務器ServerCPU
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久久9999亚洲精品 | h视频在线免费看 | 色在线免费| 二区国产 | 国产一区二区三区免费 | 欧美三级三级三级爽爽爽 | 久久成人精品视频 | 国产999精品久久久久久 | 久草视频网站 | 国产成人jvid在线播放 | 国产精品美女www爽爽爽视频 | 久久精品国产亚洲一区二区 | 久久9久 | 日韩免费视频一区二区 | 国产激情99| 一区二区三区欧美 | 美女国内精品自产拍在线播放 | 亚洲国产成人精品久久 | 国产91久久久久久久免费 | 国产日韩精品一区 | 精品成人 | 久久久久久久久久影视 | 亚洲一区二区三区四区五区午夜 | 天天操操 | 日韩精品视频在线观看一区二区三区 | 日日操视频 | 国产成人一区二区三区久久久 | 男女羞羞视频在线 | av黄色在线| 中文字幕一区在线 | 日本 欧美 三级 高清 视频 | 国产成人免费视频 | 国产精品视频久久久 | 国产精品1区2区3区 欧美 中文字幕 | 日韩中文字幕免费在线观看 | 欧美天堂 | 午夜精品久久久久久久星辰影院 | 一区二区三区四区在线视频 | 国产精品毛片一区二区三区 | 91精品国产综合久久婷婷香蕉 | 一级做a爰片性色毛片16 |