ZAP日志框架lumberjack日志归档库的分析使用
本次我們從官方例程的角度出發(fā),來分析學習如何讓zap日志框架動起來
一、 Zap官方例程
1、加糖版
logger, _ := zap.NewProduction() defer logger.Sync() // flushes buffer, if any sugar := logger.Sugar() sugar.Infow("failed to fetch URL",// Structured context as loosely typed key-value pairs."url", url,"attempt", 3,"backoff", time.Second, ) sugar.Infof("Failed to fetch URL: %s", url)2、正常高性能版
logger, _ := zap.NewProduction() defer logger.Sync() logger.Info("failed to fetch URL",// Structured context as strongly typed Field values.zap.String("url", url),zap.Int("attempt", 3),zap.Duration("backoff", time.Second), )官方例程中總共列舉出了兩種打log的方法,sugar和logger,這兩種的區(qū)別是logger的性能優(yōu)于sugar,但是sugar提供了格式化輸出sugar.Infof("Failed to fetch URL: %s", url),而logger不支持,所以根據(jù)自己的需要,來選擇兩種不同的log方式。
1、新建一個logger對象
logger, _ := zap.NewProduction()通過zap.newxxx的方法來生成一個logger對象,我們在編程時可以看到,zap總共提供了三種默認的模式和一種自定義模式
//1、生產(chǎn)模式 func NewProduction(options ...Option) (*Logger, error) //2、開發(fā)模式 func NewDevelopment(options ...Option) (*Logger, error) //3、例子 func NewExample(options ...Option) *Logger //4、自定義模式 func New(core zapcore.Core, options ...Option) *Logger四種模式對比分析
1&2&3
因為1、2、3只有配置不同,其他都相同,所以合并分析
在源碼中我們看到兩種模式都調(diào)用了NewxxxConfig()的函數(shù)。
進入兩個函數(shù)可以看到都返回了一個EncoderConfig結(jié)構(gòu)體,3中的example方法其實也是一樣的,把我們定義的Encoder返回回來。然后程序根據(jù)這些參數(shù)運行build函數(shù)
查看build函數(shù),可以看到程序把上面的參數(shù),以及另外兩個sink和level帶入了一個zapcore.Newcore的函數(shù),根據(jù)函數(shù)名推斷,應該是把這些配置寫入zap的core代碼中。
對于NewCore函數(shù)來說,現(xiàn)在第一次參數(shù)已經(jīng)有了,我們需要設置第二個和第三個參數(shù),第二個參數(shù)的意思就是寫的方法,這個地方要和lumberjack日志歸檔掛鉤,這里可以先只填入日志的保存地址,歸檔問題后面討論。
第三個參數(shù)就是日志等級。
這樣就實現(xiàn)了一個使用配置的logger對象了
4、自定義日志輸出格式
根據(jù)上面的分析我們可以看出來,4與1、2、3相比較只是多了三步
所以我們模仿可以寫出下列代碼
上述例子中我們使用ConsoleEncoder來生成了一個我們自定義的模板類型,這樣自定義參數(shù)中的zapcore.Core參數(shù)就配置完成了。
將zapcore.Core的返回值帶入zap.New就可以生成我們自定義的日志了
二、lumberjack日志歸檔庫的分析使用
剛才在前面講過,在配置writerSyncer的時候我們只添加了一個日志輸出地址,但是如果要實現(xiàn)日志的歸檔分割的話,還需要使用lumberjack庫。而lumberjack的配置需要添加到writerSyncer中
hook := lumberjack.Logger{Filename: "./zapLog" +time.Now().Format(timeLayout) + ".log",MaxSize: 1,//日志最大的大小(M)MaxBackups: 2,//備份個數(shù)MaxAge: 7,//最大保存天數(shù)(day)Compress: true,//是否壓縮LocalTime: false,}return zapcore.NewMultiWriteSyncer(zapcore.AddSync(os.Stdout), //日志同時輸出到控制臺zapcore.AddSync(&hook)//配置的hook)對于lumberjack的配置我們可以把它當做一個hook函數(shù),我們把對應的配置填入其中,最后使用zapcore.NewMultiWriteSyncer將多個配置融合到一起返回即可。
總結(jié)
以上是生活随笔為你收集整理的ZAP日志框架lumberjack日志归档库的分析使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ios上如何能运行android程序,怎
- 下一篇: 再见,斗鱼!再见,虎牙!