日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Go:日志滚动(rolling)记录器 lumberjack 简介

發布時間:2023/12/8 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Go:日志滚动(rolling)记录器 lumberjack 简介 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 簡介
    • 簡單使用
      • 1. Logger 結構體
      • 2. backup日志文件的文件名
      • 3. 獲取文件句柄
      • 4. 日志文件backup
      • 5. 日志滾動后處理
      • 6. 收集舊日志文件
      • 7. 后處理
    • 小結


簡介

lumberjack是一個日志滾動記錄器。寫入lumberjack的日志達到一定的條件后會進行存檔(普通文件的形式,或壓縮文件的形式),然后新建另一個同名文件(原文件存檔時會重命名)繼續記錄。但是lumberjack本身并不包含日志的基礎功能,例如日志等級、日志格式化等。理論上可以向lumberjack寫入任意文本,并實現滾動記錄。一般情況下,lumberjack配合其他日志庫,實現日志的滾動(rolling)記錄。

簡單使用

將lumberjack和go語言自帶的log結合起來使用,可以這么設置:

log.SetOutput(&lumberjack.Logger{Filename: "/var/log/myapp/foo.log",MaxSize: 500, // megabytesMaxBackups: 3,MaxAge: 28, //daysCompress: true, // disabled by default })

go語言的log模塊就會將日志打印到lumberjack中,lumberjack會將收到的日志寫入文件,并實現滾動記錄。

查看log.SetOutput接口

由此得知,lumberjack必須實現io.Writer接口才能與其他日志模塊相結合。事實上,lumberjack也確實實現了io.Writer接口,同時也實現了io.Closer 接口。

1. Logger 結構體

lumberjack對外暴露的方法由Logger結構提供。先來看一下Logger的內部字段:

type Logger struct {// 日志文件名,歸檔日志也會保存在對應目錄下// 若該值為空,則日志會保存到os.TempDir()目錄下,日志文件名為// <processname>-lumberjack.logFilename string `json:"filename" yaml:"filename"`// 日志大小到達MaxSize(MB)就開始backup,默認值是100.MaxSize int `json:"maxsize" yaml:"maxsize"`// 舊日志保存的最大天數,默認保存所有舊日志文件MaxAge int `json:"maxage" yaml:"maxage"`// 舊日志保存的最大數量,默認保存所有舊日志文件MaxBackups int `json:"maxbackups" yaml:"maxbackups"`// backup的日志是否使用本地時間戳,默認使用UTC時間LocalTime bool `json:"localtime" yaml:"localtime"`// 對backup的日志是否進行壓縮,默認不壓縮Compress bool `json:"compress" yaml:"compress"`size int64 // 對于當前正在寫入的文件,已經寫了多少字節 file *os.File // 當前正在寫入的文件句柄mu sync.MutexmillCh chan boolstartMill sync.Once }

從上面的字面量注釋可以看到,lumberjack.Logger支持json格式和yaml格式的配置文件,可以配置如下參數:

  • Filename——日志文件名
  • MaxSize——單個日志文件大小(MB)
  • MaxAge——日志存活時長(天)
  • MaxBackups——舊日志文件的數量
  • LocalTime——是否使用本地時間,否則使用UTC時間
  • Compress——是否對舊日志文件進行壓縮

這幾個配置參數的功能如上面的注釋縮寫,一目了然,無須過多解釋。Logger結構實現了以下對外方法:

  • Write(p []byte) (n int, err error) // 日志寫入,可能會觸發的日志歸檔,刪除過期文件,壓縮歸檔文件等
  • Close() error // 關閉當前日志文件
  • Rotate() error // 主動歸檔日志文件,而非被動觸發

可以將Logger看成是io.WriterCloser 的具體實現,并且還多了一個Rotate()的主動滾動日志的方法。

2. backup日志文件的文件名

函數backupName 將原文件名轉換為backup文件名,本質上的操作是在原來的文件名上附加固定格式的時間戳。若對backup文件進行壓縮,無非是在此基礎上增加了.gz 后綴。

在向文件名添加時間時,根據local變量可以指定使用本地時間還是UTC時間。但是lumberjack沒有開放時間格式化的接口,時間格式由一個固定的包變量決定。

由于使用的是go內置的time模塊完成格式化,所以這個時間格式……只能2006-xx…,據說這是go語言誕生的時間。想要更改backup的文件名,可以下載源碼修改并使用。對于backup的文件名,可以舉例:

原文件名:/abc/def.log
backup文件名:/abc/def-2021-01-02T19-01-31.000.log

3. 獲取文件句柄

在日志系統剛啟動的時候,需要獲取日志文件的句柄,該句柄可能是已存在的文件的,也可能是新建的文件的句柄。openExistingOrNew 方法主要用來獲取日志文件句柄:

4. 日志文件backup

當即將寫入的字節數超過當前文件的剩余配額時,即 (當前文件已寫入的字節)+(當前待寫入字節)>= MaxSize 時,就出發了日志滾動(rolling).

日志滾動分為三步:

  • 關閉原日志文件
  • 重命名原日志文件,附上時間字符串
  • 向通道millCh發送一個信號,以此觸發后處理(例如壓縮backup文件,刪除過期文件等)

5. 日志滾動后處理

上面提到日志滾動會發送信號,這時候出發了后處理操作。后處理操作在另一個goroutine中進行,不會影響當前的日志寫入。

6. 收集舊日志文件

在日志存放的文件夾下,-.log和-.log.gz文件都會被當成舊的日志文件。

注意oldLogFiles()方法的最后,對舊日志的文件名列表按時間排序,這一步很關鍵。

7. 后處理

收集完舊的日志文件后,根據MaxBackups, MaxAge, Compress三個參數完成后處理。根據MaxBackups, MaxAge 刪除過期文件,根據Compress參數決定是否壓縮哪些未壓縮的舊日志文件。

小結

Lumberjack是一個滾動記錄器,實現了io.WriteCloser 接口,本身并不具備日志功能(如格式化,日志等級等功能),只是一個文件記錄器,但是經常被用來作為日志滾動記錄的工具。Lumberjack滾動記錄日志,日志文件在滿足一定條件后就會backup,舊日志文件的文件名是在原日志文件名的基礎上附加時間信息,并可以自主選擇是否壓縮。

總結

以上是生活随笔為你收集整理的Go:日志滚动(rolling)记录器 lumberjack 简介的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。