Go中使用Zap日志库与Lumberjack日志切割

Go中使用Zap日志库与Lumberjack日志切割

Go中使用Zap日志库与Lumberjack日志切割

原创 何泽丰 ProgrammerHe
 

Go中使用Zap日志库与Lumberjack日志切割

概述

在项目中使用日志记录有助于快速定位和修复问题,能帮助我们监控系统健康状态及时发现问题。Zap是Uber开源的一个高性能、结构化、分级记录的日志记录包。这篇笔记会简单介绍Zap,以及通过Lumberjack组件根据文件大小、日期来分割日志文件。

思路

 Zap的主要特点:

  1. 1. 高性能Zap通过减少内存分配和避免interface{}的使用,实现了极高的性能。

图片

  1. 2. 结构化日志Zap支持结构化日志记录,方便将日志信息以键值对的方式记录下来,对于日志搜索、分析和聚合很有帮助。

  2. 3. 日志分级Zap支持不同的日志级别,包括Debug,Info,Warn,Error等。Debug只在开发和调适阶段启用,在生产环境中使用会产生大量日志影响性能。Info用于帮助了解系统的正常运行情况,Warn在生产环境中帮助提前发现和处理潜在问题。Error在生产环境中用于记录立即处理的错误和异常。

Zap日志库中,有两种主要的日志记录方式,分别是zap.Loggerzap.SugaredLoggerzap.Logger性能更、类型更严格,在使用时需要指定字段类型和名称,虽然代码冗长但意思更明确。SugaredLogger性能稍差(在大部分情况下可以忽略),但提供了简化的API使用起来更便捷。 Zap通过使用Lumberjack第三方库来实现日志切割,Lumberjack是一个用Go语言编写的日志滚动库,将日志文件按照一定的规则进行拆分和归档,防止单个文件过大影响性能或占用太多的磁盘空间。Lumberjack可以设置文件最大值、根据文件大小、日志文件数量、保留天数(设置文件保存天数,过期自动删除)等条件来操作日志文件。

实现

Zap的安装

go get -u go.uber.org/zap

Zap的使用

Logger

// 初始化loger
logger, err := zap.NewProduction() // 创建一个预配置的日志管理器,用于生产环境
if err != nil{
  panic(err)
}

defer logger.Sync() //刷新缓存日志

logger.Info("hello zap info")
logger.Warn("hello zap warn")
logger.Error("hello zap error")

// 结构化日志记录
logger.Info("User Logged in",
        zap.String("username""Dawei"),
        zap.Int("age"20),
)

SugaredLogger

SugaredLogger提供了简便的方法使日志更加易用。如InfowInfofInfow用于记录带有键值对的日志信息,w代表With;Infof用于记录格式化字符串的信息日志,f代表format
// 初始化logger
logger, err := zap.NewProduction() // 创建一个预配置的日志管理器,用于生产环境
if err != nil{
  panic(err)
}
defer logger.Sync() //刷新缓存日志

// 使用SugaredLogger
sugar := logger.Sugar()

sugar := logger.Sugar()
// 记录带有上下文的信息
num := 12345
str := "夏天夏天悄悄过去"
sugar.Infow("Error 是因为""数字", num, "语句", str)
sugar.Infof("Error %s""留下小秘密")

// {"level":"info","ts":1718096086.7370722,"caller":"ZapDemo/main.go:26","msg":"Error 是因为","数字":12345,"语句":"夏天夏天悄悄过去"}
// {"level":"info","ts":1718096086.7371142,"caller":"ZapDemo/main.go:27","msg":"Error 留下小秘密"}

Lumberjack的安装

go get gopkg.in/natefinch/lumberjack.v2

Lumberjack的使用

首先我们需要初始化Lumberjack的配置,再将该配置添加到zap.logger中。在Lumberjack的配置中,可以指定Filename日志文件的名称和路径、MaxSize单个日志文件的最大值(如达到最大值就触发滚动),MaxBackups最大备份数,MaxAge(日志文件最长保留期限),Compress(是否压缩旧文件)
lumberjackLogger := &lumberjack.Logger{
        Filename:   "./project/ZapDemo/log/test.log",
        MaxSize:    10, //MB
        MaxBackups: 2,
        MaxAge:     28,   // days
        Compress:   true, // 是否压缩文件
    }
    // 初始化logger
    zapLogger := zap.New(zapcore.NewCore(
        zapcore.NewConsoleEncoder(zap.NewProductionEncoderConfig()),  //使用控制台编码器
        zapcore.AddSync(lumberjackLogger), // 将日志写入到 lumberjackLogger 提供的输出中
        zap.InfoLevel,  // 设置日志级别为 InfoLevel,即只记录 Info 级别及以上的日志消息
    ))
    defer zapLogger.Sync()

    for i := 0i < 100i++ {
        str := fmt.Sprintf("hi %d", i)
        zapLogger.Info(str)
    }

图片

 

Go · 目录
上一篇基于GitLab搭建Go项目自动构建环境下一篇Casbin笔记(1)
阅读 277
 
posted @   技术颜良  阅读(228)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
历史上的今天:
2022-08-04 Linux: split 文件分割和合并
2021-08-04 Percona Monitoring and Management
2020-08-04 Docker Bind Mount 与 Volume
2020-08-04 Docker 容器数据卷(挂载)
2020-08-04 在docker容器下利用数据卷实现在删除了mysql容器或者镜像的情况下恢复数据
点击右上角即可分享
微信分享提示