温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么在Lumberjack中利用zap对日志进行切割

发布时间:2020-12-16 16:05:52 来源:亿速云 阅读:699 作者:Leah 栏目:开发技术

本篇文章给大家分享的是有关怎么在Lumberjack中利用zap对日志进行切割,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

使用Lumberjack+zap进行日志切割归档

为了添加日志切割归档功能,我们将使用第三方库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个备份)。

补充:golang zap日志的使用

zap是一个高性能日志库,github链接【传送门】,下面简单介绍一下zap的使用。

1.下载zap包

因为zap是uber开源的,zap内使用的包是在go.uber.org/zap,如果直接go get这个包,可能会提示get不下来。可以go get github.com/uber-go/zap,然后再把zap目录复制到src/go.uber.org下(可能还会需要go.uber.org/atomic和go.uber.org/multierr,均可参考该方法get下来)

2.zap简单封装示例。

package logger   import (  "go.uber.org/zap"  "go.uber.org/zap/zapcore"  "gopkg.in/natefinch/lumberjack.v2" )   // error logger var errorLogger *zap.SugaredLogger   var levelMap = map[string]zapcore.Level{  "debug": zapcore.DebugLevel,  "info": zapcore.InfoLevel,  "warn": zapcore.WarnLevel,  "error": zapcore.ErrorLevel,  "dpanic": zapcore.DPanicLevel,  "panic": zapcore.PanicLevel,  "fatal": zapcore.FatalLevel, }   func getLoggerLevel(lvl string) zapcore.Level {  if level, ok := levelMap[lvl]; ok {  return level  }  return zapcore.InfoLevel }   func init() {  fileName := "zap.log"  level := getLoggerLevel("debug")  syncWriter := zapcore.AddSync(&lumberjack.Logger{  Filename: fileName,  MaxSize: 1 << 30, //1G  LocalTime: true,  Compress: true,  })  encoder := zap.NewProductionEncoderConfig()  encoder.EncodeTime = zapcore.ISO8601TimeEncoder  core := zapcore.NewCore(zapcore.NewJSONEncoder(encoder), syncWriter, zap.NewAtomicLevelAt(level))  logger := zap.New(core, zap.AddCaller(), zap.AddCallerSkip(1))  errorLogger = logger.Sugar() }   func Debug(args ...interface{}) {  errorLogger.Debug(args...) }   func Debugf(template string, args ...interface{}) {  errorLogger.Debugf(template, args...) }   func Info(args ...interface{}) {  errorLogger.Info(args...) }   func Infof(template string, args ...interface{}) {  errorLogger.Infof(template, args...) }   func Warn(args ...interface{}) {  errorLogger.Warn(args...) }   func Warnf(template string, args ...interface{}) {  errorLogger.Warnf(template, args...) }   func Error(args ...interface{}) {  errorLogger.Error(args...) }   func Errorf(template string, args ...interface{}) {  errorLogger.Errorf(template, args...) }   func DPanic(args ...interface{}) {  errorLogger.DPanic(args...) }   func DPanicf(template string, args ...interface{}) {  errorLogger.DPanicf(template, args...) }   func Panic(args ...interface{}) {  errorLogger.Panic(args...) }   func Panicf(template string, args ...interface{}) {  errorLogger.Panicf(template, args...) }   func Fatal(args ...interface{}) {  errorLogger.Fatal(args...) }   func Fatalf(template string, args ...interface{}) {  errorLogger.Fatalf(template, args...) }

3.简单封装后使用示例:

package main   import (  "logger" )   func main() {  logger.Infof("simple zap logger example")  }

以上就是怎么在Lumberjack中利用zap对日志进行切割,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI