Go中使用Zap日志库与Lumberjack日志切割
Go中使用Zap日志库与Lumberjack日志切割
Go中使用Zap日志库与Lumberjack日志切割
Go中使用Zap日志库与Lumberjack日志切割
概述
在项目中使用日志记录有助于快速定位和修复问题,能帮助我们监控系统健康状态及时发现问题。Zap
是Uber开源的一个高性能、结构化、分级记录的日志记录包。这篇笔记会简单介绍Zap
,以及通过Lumberjack
组件根据文件大小、日期来分割日志文件。
思路
Zap
的主要特点:
-
1. 高性能。
Zap
通过减少内存分配和避免interface{}
的使用,实现了极高的性能。
-
2. 结构化日志。
Zap
支持结构化日志记录,方便将日志信息以键值对的方式记录下来,对于日志搜索、分析和聚合很有帮助。 -
3. 日志分级。
Zap
支持不同的日志级别,包括Debug,Info,Warn,Error等。Debug
只在开发和调适阶段启用,在生产环境中使用会产生大量日志影响性能。Info
用于帮助了解系统的正常运行情况,Warn
在生产环境中帮助提前发现和处理潜在问题。Error
在生产环境中用于记录立即处理的错误和异常。
Zap
日志库中,有两种主要的日志记录方式,分别是zap.Logger
和zap.SugaredLogger
。zap.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
提供了简便的方法使日志更加易用。如Infow
和Infof
。Infow
用于记录带有键值对的日志信息,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 := 0; i < 100; i++ {
str := fmt.Sprintf("hi %d", i)
zapLogger.Info(str)
}
Go · 目录
上一篇基于GitLab搭建Go项目自动构建环境下一篇Casbin笔记(1)
· 全网最简单!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容器或者镜像的情况下恢复数据