Golang zap和lumberjack实现日志存储和自动管理
生活随笔
收集整理的這篇文章主要介紹了
Golang zap和lumberjack实现日志存储和自动管理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
期望實現功能
按不同的日志級別存儲到不同的日志文件中(這里只實現了info和error級別)
控制最多保留的日志文件及保留最近多少天的日志文件(控制日志的最大磁盤使用量)
控制每個日志文件的大小
?
我們使用zap和lumberjack框架實現
go get -u go.uber.org/zap go get gopkg.in/natefinch/lumberjack.v2?
lumberjack的Logger結構體如下 type Logger struct {//寫日志的文件名稱Filename string `json:"filename" yaml:"filename"`//每個日志文件長度的最大大小,默認100M。MaxSize int `json:"maxsize" yaml:"maxsize"`//日志保留的最大天數(只保留最近多少天的日志)MaxAge int `json:"maxage" yaml:"maxage"`//只保留最近多少個日志文件,用于控制程序總日志的大小MaxBackups int `json:"maxbackups" yaml:"maxbackups"`//是否使用本地時間,默認使用UTC時間LocalTime bool `json:"localtime" yaml:"localtime"`// 是否壓縮日志文件,壓縮方法gzipCompress bool `json:"compress" yaml:"compress"`size int64 //記錄當前日志文件的字節數file *os.File //當前的日志文件mu sync.MutexmillCh chan boolstartMill sync.Once }lumberjack的使用及源碼可參考:https://mp.csdn.net/console/editor/html/107142274
?
示例
package applogimport("strings""path/filepath""go.uber.org/zap""go.uber.org/zap/zapcore""gopkg.in/natefinch/lumberjack.v2" )var (infoLevel = "info"errorLevel = "error"debugLevel = "debug" )func NewLog(dir, prefix,level string,maxSize,maxBackups,maxAge int) (*zap.Logger, func(),error) {if maxSize < 0 {maxSize = 0}if maxBackups < 0 {maxBackups = 0}if maxAge < 0 {maxAge = 0}infoLog := &lumberjack.Logger{Filename: getFilePath(dir, prefix, infoLevel),MaxSize: maxSize,MaxBackups: maxBackups,MaxAge: maxAge,LocalTime: true,Compress: false,}errLog := &lumberjack.Logger{Filename: getFilePath(dir, prefix, errorLevel),MaxSize: maxSize,MaxBackups: maxBackups,MaxAge: maxAge,LocalTime: true,Compress: false,}cronLogger := &lumberLog{dir:dir,prefix: prefix,level: level,infoLog: infoLog,errLog: errLog,}return cronLogger.getLoggerWithCron(), func() {cronLogger.StopLogger()},nil }func (l *lumberLog) rotate() {if l.infoLog != nil {l.infoLog.Rotate()}if l.errLog != nil {l.errLog.Rotate()} }type lumberLog struct {dir stringprefix stringlevel stringinfoLog *lumberjack.LoggererrLog *lumberjack.Logger }func (l *lumberLog) StopLogger() {l.infoLog.Close()l.errLog.Close() }func (l *lumberLog)getLoggerWithCron() (*zap.Logger) {highPriority := zap.LevelEnablerFunc(func(lev zapcore.Level) bool{return lev >= zap.ErrorLevel})lowLevel := zap.InfoLevelif strings.EqualFold(l.level,debugLevel) {lowLevel = zap.DebugLevel}lowPriority := zap.LevelEnablerFunc(func(lev zapcore.Level) bool {return lev < zap.ErrorLevel && lev >= lowLevel})prodEncoder := zap.NewProductionEncoderConfig()prodEncoder.EncodeTime = zapcore.ISO8601TimeEncoderprodEncoder.CallerKey = ""highCore := zapcore.NewCore(zapcore.NewJSONEncoder(prodEncoder),zapcore.AddSync(l.errLog),highPriority)lowCore := zapcore.NewCore(zapcore.NewJSONEncoder(prodEncoder),zapcore.AddSync(l.infoLog),lowPriority)return zap.New(zapcore.NewTee(highCore,lowCore)) }func getFilePath(dir, prefile, level string) string {return filepath.Join(dir,level,prefile+"-"+level)+".log" }?
總結
以上是生活随笔為你收集整理的Golang zap和lumberjack实现日志存储和自动管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: QML入门教程(2): QML Butt
- 下一篇: 对话南科大沈平:在人工智能开源中,高校能