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 简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 龙之战神微信登录服务器,龙之战神微信登录
- 下一篇: JAVA时间日期处理类,主要用来遍历两个