Golang Zap 日志库深度解析:文件切割与级别存储

3 下载量 135 浏览量 更新于2024-08-30 收藏 145KB PDF 举报
本文主要探讨了Golang中的 zap 日志库,如何满足常见的日志处理需求,包括将不同级别的日志输出到不同的文件,按文件大小或日期进行切割存储,以及如何实现全局的日志配置。文章引用了李文周大神的博客作为参考资料,并提供了具体的代码示例来说明如何实现日志按级别分文件切割存储。 在Golang中,Uber公司的zap日志库因其高效和易用性而被广泛采用。为了满足日志处理的需求,我们首先需要实现两个LevelEnablerFunc接口,一个用于过滤Info级别及以上的日志,另一个用于过滤Error级别及以上的日志: ```go infoLevel := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool { return lvl >= zapcore.InfoLevel }) errorLevel := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool { return lvl >= zapcore.ErrorLevel }) ``` 接着,我们需要获取Info和Error日志的io.Writer实例,这通常涉及到文件的创建和管理。这里使用了第三方库`github.com/lestrrat-go/file-rotatelogs`来实现日志的滚动和切割: ```go func getWriter(filename string) io.Writer { hook, err := rotatelogs.New( strings.Replace(filename, ".log", "", -1)+"-%Y%m%d%H.log", // 可以添加以下选项: // rotatelogs.WithLinkName(filename), // rotatelogs.WithMaxAge(time.Hour*24*7), // rotatelogs.WithRotationTime(time.Hour), ) if err != nil { panic(err) } return hook } ``` 通过上述设置,我们可以将Info级别的日志写入到`demo_info.log`,Error级别的日志写入到`demo_error.log`。`rotatelogs.New`函数允许我们根据时间规则(如每天或每小时)自动切割日志文件,并保持一定数量的历史记录。 为了全局使用zap日志,我们需要配置一个zap.Logger实例,然后通过zap.Sink方法将日志输出到之前创建的io.Writer: ```go core := zapcore.NewCore( zapcore.NewJSONEncoder(zap.NewDevelopmentEncoderConfig()), // 编码器配置 zapcore.NewMultiWriteSyncer(infoWriter, errorWriter), // 多个日志目的地 zap.NewAtomicLevelAt(zapcore.DebugLevel), // 设置默认日志级别 ) logger := zap.New(core, zap.AddCaller()) // 创建logger并添加调用者信息 ``` 最后,我们可以将这个logger设置为全局的日志器,以便在整个应用中统一使用: ```go log = logger.Sugar() ``` 现在,你可以使用`log.Infof`和`log.Errorf`分别输出Info和Error级别的日志,同时,日志会根据设定的规则自动切割和存储。这样,我们就实现了日志库的高效、灵活和易于维护的使用方式。