多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] ## 使用Lumberjack+zap进行日志切割归档 为了添加日志切割归档功能,我们将使用第三方库[Lumberjack](https://github.com/natefinch/lumberjack)来实现。 ## 安装 执行下面的命令安装Lumberjack ``` go get -u github.com/natefinch/lumberjack ``` ## zap logger中加入Lumberjack 要在zap中加入Lumberjack支持,我们需要修改`WriteSyncer`代码。我们将按照下面的代码修改`getLogWriter()`函数: ``` func getLogWriter() zapcore.WriteSyncer { lumberJackLogger := &lumberjack.Logger{ Filename: "./test.log", MaxSize: 10, MaxBackups: 5, MaxAge: 30, Compress: false, } return zapcore.AddSync(&lumberJackLogger) } ``` Lumberjack Logger采用以下属性作为输入: * Filename: 日志文件的位置 * MaxSize:在进行切割之前,日志文件的最大大小(以MB为单位) * MaxBackups:保留旧文件的最大个数 * MaxAges:保留旧文件的最大天数 * Compress:是否压缩/归档旧文件 ## 测试所有功能 ``` package main import ( "net/http" "go.uber.org/zap" "go.uber.org/zap/zapcore" lumberjack "gopkg.in/natefinch/lumberjack.v2" ) var sugarLogger *zap.SugaredLogger func main() { InitLogger() defer sugarLogger.Sync() for i:=0; i < 10000;i++ { simpleHttpGet("www.baidu.com") simpleHttpGet("http://www.baidu.com") } } func InitLogger() { writeSyncer := getLogWriter() encoder := getEncoder() core := zapcore.NewCore(encoder, writeSyncer, zapcore.DebugLevel) logger := zap.New(core, zap.AddCaller()) sugarLogger = logger.Sugar() } func getEncoder() zapcore.Encoder { encoderConfig := zap.NewProductionEncoderConfig() encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder return zapcore.NewConsoleEncoder(encoderConfig) } func getLogWriter() zapcore.WriteSyncer { lumberJackLogger := &lumberjack.Logger{ Filename: "/aseit-data/gocode/src/gitlab.aseit.cn/AI_PRODUCT/psd_be_zhang/test/test.log", // ⽇志⽂件路径 MaxSize: 1, // 1M=1024KB=1024000byte MaxBackups: 5, // 最多保留5个备份 MaxAge: 30, // days Compress: false, // 是否压缩 disabled by default } return zapcore.AddSync(lumberJackLogger) } func simpleHttpGet(url string) { sugarLogger.Debugf("Trying to hit GET request for %s", url) resp, err := http.Get(url) if err != nil { sugarLogger.Errorf("Error fetching URL %s : Error = %s", url, err) } else { sugarLogger.Infof("Success! statusCode = %s for URL %s", resp.Status, url) resp.Body.Close() } } ``` 同时,可以在`main`函数中循环记录日志,测试日志文件是否会自动切割和归档(日志文件每1MB会切割并且在当前目录下最多保存5个备份)。