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

 更新时间:2020年12月16日 11:55:28   作者:线条君  
这篇文章主要介绍了使用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") 
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

相关文章

  • Golang的Crypto/SHA256库实战指南

    Golang的Crypto/SHA256库实战指南

    无论是在保护数据安全、验证数据完整性,还是在构建复杂的安全系统中,crypto/sha256都是Golang程序员不可或缺的工具,本文主要介绍了Golang的Crypto/SHA256库实战指南,感兴趣的可以了解一下
    2024-02-02
  • golang框架中跨服务的最佳通信协议和工具

    golang框架中跨服务的最佳通信协议和工具

    在 go 框架中实现跨服务通信的最佳实践包括使用 grpc(适用于低延迟高吞吐量)、http 客户端(适用于 restful api)和消息队列(适用于异步解耦通信),在选择通信方式时,应考虑服务交互模式、性能要求和部署环境等因素
    2024-06-06
  • golang中的三个点 ''...''的用法示例详解

    golang中的三个点 ''...''的用法示例详解

    这篇文章主要介绍了golang中的三个点 '...' 的用法示例详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • 在Go中实现高效可靠的链路追踪系统

    在Go中实现高效可靠的链路追踪系统

    在当今互联网应用的架构中,分布式系统已经成为主流,分布式系统的优势在于能够提供高可用性、高并发性和可扩展性,本文将介绍链路追踪的概念和原理,并重点介绍如何在Golang中实现高效可靠的链路追踪系统,需要的朋友可以参考下
    2023-10-10
  • 使用golang编写一个并发工作队列

    使用golang编写一个并发工作队列

    这篇文章主要介绍了使用golang编写一个并发工作队列的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • Golang中的自定义函数详解

    Golang中的自定义函数详解

    函数构成代码执行的逻辑结构。在Go语言中,函数的基本组成为:关键字func、函数名、参数列表、返回值、函数体和返回语句。
    2018-10-10
  • 关于golang test缓存问题

    关于golang test缓存问题

    这篇文章主要介绍了关于golang test缓存问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • GO语言(golang)基础知识

    GO语言(golang)基础知识

    这篇文章主要介绍了GO语言(golang)基础知识,需要的朋友可以参考下
    2015-01-01
  • Golang http包构建RESTful API的实现

    Golang http包构建RESTful API的实现

    在Go语言中实现RESTful API可以利用标准库net/http提供的功能,它允许你轻松地创建和处理HTTP请求,本文主要介绍了Golang http包构建RESTful API的实现,感兴趣的可以了解一下
    2024-01-01
  • Golang自动追踪GitHub上热门AI项目

    Golang自动追踪GitHub上热门AI项目

    这篇文章主要为大家介绍了Golang自动追踪GitHub上热门AI项目,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12

最新评论