Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Go 使用 zap 日志库

Go 使用 zap 日志库

作者头像
晓晨
发布于 2022-10-04 13:42:01
发布于 2022-10-04 13:42:01
1.1K00
代码可运行
举报
文章被收录于专栏:晓晨的专栏晓晨的专栏
运行总次数:0
代码可运行

1.前言

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

2.安装使用

安装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
go get -u go.uber.org/zap

快速入门

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
customTimeEncoder := func(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
	enc.AppendString(t.Format("2006-01-02 15:04:05.000"))
}

自定义日志级别显示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
customLevelEncoder := func(level zapcore.Level, enc zapcore.PrimitiveArrayEncoder) {
	enc.AppendString(level.CapitalString())
}

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
customCallerEncoder := func(caller zapcore.EntryCaller, enc zapcore.PrimitiveArrayEncoder) {
		enc.AppendString("[" + caller.TrimmedPath() + "]")
}

构建配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
zapLoggerEncoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder
syncWriter = zapcore.NewMultiWriteSyncer(zapcore.AddSync(os.Stdout))

输出到文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
zapCore := zapcore.NewCore(zapcore.NewConsoleEncoder(zapLoggerEncoderConfig), syncWriter, level)
zapLogger = zap.New(zapCore, zap.AddCaller(), zap.AddCallerSkip(1))

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

效果

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
如何自定义zap的日志输出格式?
上一篇介绍到如何在go-kit整合zap进行log输出《go-kit 微服务 整合zap日志库》,最后整合完毕后发现返回的log是一个json格式和项目标准的日志格式有一些不一样,所以想自定义zap log的输出格式。
Johns
2021/04/10
10.1K3
如何自定义zap的日志输出格式?
Go 语言怎么使用 zap 日志库?
我们在之前的文章中介绍过标准库 log 包的使用方式,它虽然使用方便,但是它支持的功能比较简单。
frank.
2023/09/08
3660
Go 语言怎么使用 zap 日志库?
Golang高性能日志库zap + lumberjack 日志切割组件详解
Zap提供了两种类型的日志记录器 — Sugared Logger 和 Logger
传说之下的花儿
2023/04/16
5.4K0
Golang高性能日志库zap + lumberjack 日志切割组件详解
私有化部署会议系统EasyRTC-SFU内Go语言日志Zap使用教程介绍
企业视频通话会议系统EasyRTC基于网络架构,各分支机构与总部之间使用IP线路连接,在总部部署服务器提供视频调度指挥服务,能够进行视频会议、远程培训、协同工作等沟通。近期更新的新版本EasyRTC-SFU更是在原有基础上进行了升级改造,在系统的集成性、承载量上有更大的提升。
TSINGSEE青犀视频
2021/04/19
8800
go-kit 微服务 整合zap日志库
zap是Uber开源的一款高性能的日志库,和seelog,logrus相比,高性能是它的突出优势, 已经在业界广泛使用,下面拿官方的性能测试对比原图来说明
Johns
2021/03/22
2.3K0
go-kit 微服务 整合zap日志库
Zap日志库并集成Gin
在许多Go语言项目中,我们需要一个好的日志记录器能够提供下面这些功能: 1 . 能够将事件记录到文件中,而不是应用程序控制台; 2 . 日志切割-能够根据文件大小、时间或间隔等来切割日志文件; 3 . 支持不同的日志级别。例如INFO,DEBUG,ERROR等; 4 . 能够打印基本信息,如调用文件/函数名和行号,日志时间等;
iginkgo18
2021/04/23
3.6K0
Zap高性能日志库实践
Zap 是一个由 Uber 公司开源的结构化、高性能日志记录库,旨在为 Go 语言提供一种快速、简单且高效的日志解决方案。它起源于 Uber 内部使用的日志系统,后来于 2016 年开源,迅速获得了 Go 社区的广泛关注和应用。
FunTester
2024/06/18
2980
Zap高性能日志库实践
Go项目实现日志按时间及文件大小切割并压缩
关于日志的一些问题: 单个文件过大会影响写入效率,所以会做拆分,但是到多大拆分? 最多保留几个日志文件?最多保留多少天,要不要做压缩处理? 一般都使用 lumberjack[1]这个库完成上述这些操作
fliter
2023/09/05
2.4K0
Go项目实现日志按时间及文件大小切割并压缩
Golang zap 快速上手
zap 是 Uber 开源的一款高性能日志库,它支持多种日志级别和输出方式,包括 console、json、file 等。zap 性能比较优秀,它使用了 Zero Allocation 的设计理念,在不影响性能的情况下尽量避免内存分配。
恋喵大鲤鱼
2023/02/23
1.2K0
手把手,带你从零封装Gin框架(三):日志初始化
本篇来讲一下怎么将日志服务集成到项目中,它也是框架中必不可少的,平时代码调试,线上 Bug 分析都离不开它。这里将使用 zap 作为日志库,一般来说,日志都是需要写入到文件保存的,这也是 zap 唯一缺少的部分,所以我将结合 lumberjack 来使用,实现日志切割归档的功能
用户10002156
2024/01/10
1.3K1
手把手,带你从零封装Gin框架(三):日志初始化
Go 浅析主流日志库:从设计层学习如何集成日志轮转与切割功能
在现有的日志库中,包括 go 1.21.0 引入的 slog 日志库,它们通常都支持对日志文件进行轮转与切割,只不过这些功能并不直接被内置,而是需要我们主动配置来启用。
陈明勇
2023/11/28
2.4K0
Go 浅析主流日志库:从设计层学习如何集成日志轮转与切割功能
聊聊golang的zap的NewExample
NewExample使用通过core来创建Logger,其中core使用的Encoder为JSONEncoder,WriteSyncer使用的是os.Stdout,LevelEnabler使用的是DebugLevel;NewJSONEncoder创建的是jsonEncoder;其EncodeEntry方法一次打印LevelKey、TimeKey、LoggerName、Caller,最后才是业务的message本身,然后结束json打印,对于有stacktrace还会以非json的形式(普通堆栈形式)打印stacktrace
code4it
2020/12/07
3210
聊聊golang的zap的NewExample
Go每日一库之87:zap
大多数日志库提供的方式是基于反射的序列化和字符串格式化,这种方式代价高昂,而 Zap 采取不同的方法。
luckpunk
2023/09/30
7780
Go每日一库之87:zap
【测试平台系列】第一章 手撸压力机(六)- 日志服务及使用yaml配置文件
上一章节我们封装TO(测试对象),方便我们以后扩展其他被测的接口或协议。本章我们主要实现以下,我们的日志输出。在以前的章节中,我们都是使用go的fmt包进行日志输出(打印到控制台),在工作中我们都知道,我们的服务都是有日志文件,以及日志级别的。下面我们就实现一下,将指定的级别的日志,输出到日志文件中。
被测试耽误的大厨
2023/11/24
1920
【测试平台系列】第一章 手撸压力机(六)- 日志服务及使用yaml配置文件
聊聊golang的zap的NewDevelopment
NewDevelopmentEncoderConfig创建zapcore.EncoderConfig,其LineEnding为zapcore.DefaultLineEnding,EncodeLevel为zapcore.CapitalLevelEncoder,EncodeTime为zapcore.ISO8601TimeEncoder,EncodeDuration为zapcore.StringDurationEncoder,EncodeCaller为zapcore.ShortCallerEncoder
code4it
2020/12/06
2570
聊聊golang的zap的NewDevelopment
用 Zap 轻松搞定 Go 语言中的结构化日志
文章链接:https://cloud.tencent.com/developer/article/2465146
南山竹
2024/11/13
1530
用 Zap 轻松搞定 Go 语言中的结构化日志
三个实用细节,让Zap在Go项目中变得更好用
一个项目日志功能够不够健全、记录的日志内容够不够有辨识度直接决定了一个项目维护的难度,你查日志是大海捞针一点点看,还是能够靠一些有辨识度的索引筛选出用户访问程序期间留下的包含了完整上下文的日志直接决定了你搞明白“为什么会这样”所耗费时间的多少。
KevinYan
2024/11/23
1130
三个实用细节,让Zap在Go项目中变得更好用
GoLang 日志库 zap 的使用
zap 是 Uber 开源的 go语言的日志库,它的优势在于实时写结构化日志(Structured Logging)到文件有很好的性能。结构化日志就是说相比于直接输出日志文本,使用 json 或者其它编码方式使日志结构化,这样可以方便后续用各种工具分析处理和查找,比如用 ELK(Elasticsearch, Logstash and Kibana)。根据 zap 自己的基准库测试结果,它比其它结构化日志的库(比如我之前使用的 logrus )要有更好的性能。接下来主要介绍一下 zap 库的使用方法。
饶文津
2020/06/15
10.8K0
聊聊golang的zap的NewProduction
zap.NewProduction()通过创建NewProductionEncoderConfig再Build出Logger,其中Logger的New方法主要设置了core、errorOutput、addStack属性
code4it
2020/12/05
1620
聊聊golang的zap的NewProduction
Fabric区块解析
本文是区块链浏览器系列的第三篇,本文介绍区块链浏览器的主体部分,即区块数据的解析。
孟斯特
2023/10/16
2100
Fabric区块解析
相关推荐
如何自定义zap的日志输出格式?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档