Go 使用 zap 日志库
1.前言#
zap 是我个人比较喜欢的日志库,是 uber 开源的,有较好的性能。很多开源 Go 项目都使用它作为日志组件。
2.安装使用#
安装
go get -u go.uber.org/zap
快速入门
logger, _ := zap.NewProduction()
defer logger.Sync() // flushes buffer, if any
sugar := logger.Sugar()
sugar.Infow("failed to fetch URL",
// Structured context as loosely typed key-value pairs.
"url", url,
"attempt", 3,
"backoff", time.Second,
)
sugar.Infof("Failed to fetch URL: %s", url)
3.进阶#
这里介绍一些我常用的配置方式。
自定义时间格式
customTimeEncoder := func(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
enc.AppendString(t.Format("2006-01-02 15:04:05.000"))
}
自定义日志级别显示
customLevelEncoder := func(level zapcore.Level, enc zapcore.PrimitiveArrayEncoder) {
enc.AppendString(level.CapitalString())
}
自定义代码路径、行号输出
customCallerEncoder := func(caller zapcore.EntryCaller, enc zapcore.PrimitiveArrayEncoder) {
enc.AppendString("[" + caller.TrimmedPath() + "]")
}
构建配置
zapLoggerEncoderConfig := zapcore.EncoderConfig{
TimeKey: "time",
LevelKey: "level",
NameKey: "logger",
CallerKey: "caller",
MessageKey: "message",
StacktraceKey: "stacktrace",
EncodeCaller: customCallerEncoder,
EncodeTime: customTimeEncoder,
EncodeLevel: customLevelEncoder,
EncodeDuration: zapcore.SecondsDurationEncoder,
LineEnding: "\n",
ConsoleSeparator: " ",
}
控制台输出配置(带颜色)
zapLoggerEncoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder
syncWriter = zapcore.NewMultiWriteSyncer(zapcore.AddSync(os.Stdout))
输出到文件
syncWriter = zapcore.NewMultiWriteSyncer(zapcore.AddSync(os.Stdout), zapcore.AddSync(&lumberjack.Logger{
Filename: "logs/app/app.log", // ⽇志⽂件路径
MaxSize: 100, // 单位为MB,默认为512MB
MaxAge: 5, // 文件最多保存多少天
LocalTime: true, // 采用本地时间
Compress: false, // 是否压缩日志
}))
lumberjack 需要自己安装
go get gopkg.in/natefinch/lumberjack.v2
异步输出到文件
syncWriter = &zapcore.BufferedWriteSyncer{
WS: zapcore.AddSync(&lumberjack.Logger{
Filename: "logs/app/app.log", // ⽇志⽂件路径
MaxSize: 100, // 单位为MB,默认为512MB
MaxAge: 5, // 文件最多保存多少天
LocalTime: true, // 采用本地时间
Compress: false, // 是否压缩日志
}),
Size: 4096,
}
构建 logger
zapCore := zapcore.NewCore(zapcore.NewConsoleEncoder(zapLoggerEncoderConfig), syncWriter, level)
zapLogger = zap.New(zapCore, zap.AddCaller(), zap.AddCallerSkip(1))
记得在程序退出时调用 zapLogger.Sync()
,不然会造成丢失日志。
效果
作者:晓晨Master(李志强)
出处:https://www.cnblogs.com/stulzq/p/16741844.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
目前学习.NET Core 最好的教程 .NET Core 官方教程 ASP.NET Core 官方教程
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2020-09-29 Redash 二开 - 前端环境搭建
2020-09-29 Redash 二开 - 后端技术准备
2017-09-29 Centos7/Ubuntu 初始化硬盘分区、挂载