前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go 使用 zap 日志库

Go 使用 zap 日志库

作者头像
晓晨
发布2022-10-04 21:42:01
8770
发布2022-10-04 21:42:01
举报
文章被收录于专栏:晓晨的专栏晓晨的专栏

1.前言

zap 是我个人比较喜欢的日志库,是 uber 开源的,有较好的性能。很多开源 Go 项目都使用它作为日志组件。

image-20220929153104876
image-20220929153104876

2.安装使用

安装

代码语言:javascript
复制
go get -u go.uber.org/zap

快速入门

代码语言:javascript
复制
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.进阶

这里介绍一些我常用的配置方式。

自定义时间格式

代码语言:javascript
复制
customTimeEncoder := func(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
	enc.AppendString(t.Format("2006-01-02 15:04:05.000"))
}
image-20220929153402709
image-20220929153402709

自定义日志级别显示

代码语言:javascript
复制
customLevelEncoder := func(level zapcore.Level, enc zapcore.PrimitiveArrayEncoder) {
	enc.AppendString(level.CapitalString())
}

自定义代码路径、行号输出

代码语言:javascript
复制
customCallerEncoder := func(caller zapcore.EntryCaller, enc zapcore.PrimitiveArrayEncoder) {
		enc.AppendString("[" + caller.TrimmedPath() + "]")
}

构建配置

代码语言:javascript
复制
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: " ",
}

控制台输出配置(带颜色)

代码语言:javascript
复制
zapLoggerEncoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder
syncWriter = zapcore.NewMultiWriteSyncer(zapcore.AddSync(os.Stdout))

输出到文件

代码语言:javascript
复制
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

异步输出到文件

代码语言:javascript
复制
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

代码语言:javascript
复制
zapCore := zapcore.NewCore(zapcore.NewConsoleEncoder(zapLoggerEncoderConfig), syncWriter, level)
zapLogger = zap.New(zapCore, zap.AddCaller(), zap.AddCallerSkip(1))

记得在程序退出时调用 zapLogger.Sync(),不然会造成丢失日志。

效果

image-20220929154425738
image-20220929154425738
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-09-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.前言
  • 2.安装使用
  • 3.进阶
相关产品与服务
日志服务
日志服务(Cloud Log Service,CLS)是腾讯云提供的一站式日志服务平台,提供了从日志采集、日志存储到日志检索,图表分析、监控告警、日志投递等多项服务,协助用户通过日志来解决业务运维、服务监控、日志审计等场景问题。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档