Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何自定义zap的日志输出格式?

如何自定义zap的日志输出格式?

原创
作者头像
Johns
修改于 2021-04-10 10:27:14
修改于 2021-04-10 10:27:14
10K3
举报
文章被收录于专栏:代码工具代码工具

问题背景

上一篇介绍到如何在go-kit整合zap进行log输出《go-kit 微服务 整合zap日志库》,最后整合完毕后发现返回的log是一个json格式和项目标准的日志格式有一些不一样,所以想自定义zap log的输出格式。

原来的格式:

代码语言:txt
AI代码解释
复制
{"level":"info","ts":1617979575129,"caller":"cmd/main.go:62","msg":"prom server start success, port 10081"}

希望输出的样子

代码语言:txt
AI代码解释
复制
[2021-04-10 17:27:55.419] [INFO] [212fb8d8-4e30-44fd-a6f2-d0a9b9799b9d] [cmd/main.go:62]  prom server start success, port 10081

解决方案

查阅了一下官方zap的输出格式时通过zapcore.EncoderConfig对象进行配置的, 所以我们也只需要修改它的一个初始化过程便可, 其中212fb8d8-4e30-44fd-a6f2-d0a9b9799b9d是一个全局的请求id(trace_id)我们可以先忽略这个内容部分,先看怎么改。

代码语言:txt
AI代码解释
复制
const (
	logTmFmtWithMS = "2006-01-02 15:04:05.000"
)

func initCore(l *Log) zapcore.Core {
	opts := []zapcore.WriteSyncer{
		zapcore.AddSync(&lumberjack.Logger{
			Filename:  filepath.Join(l.logDir, l.logFileName), // ⽇志⽂件路径
			MaxSize:   l.logMaxSize,                           // 单位为MB,默认为512MB
			MaxAge:    l.logMaxAge,                            // 文件最多保存多少天
			LocalTime: l.localTime,                            // 采用本地时间
			Compress:  l.logCompress,                          // 是否压缩日志
		}),
	}

	if l.stdout {
		opts = append(opts, zapcore.AddSync(os.Stdout))
	}

	syncWriter := zapcore.NewMultiWriteSyncer(opts...)

	// 自定义时间输出格式
	customTimeEncoder := func(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
		enc.AppendString("[" + t.Format(logTmFmtWithMS) + "]")
	}
	// 自定义日志级别显示
	customLevelEncoder := func(level zapcore.Level, enc zapcore.PrimitiveArrayEncoder) {
		enc.AppendString("[" + level.CapitalString() + "]")
	}

	// 自定义文件:行号输出项
	customCallerEncoder := func(caller zapcore.EntryCaller, enc zapcore.PrimitiveArrayEncoder) {
		enc.AppendString("[" + l.traceId + "]")
		enc.AppendString("[" + caller.TrimmedPath() + "]")
	}

	encoderConf := zapcore.EncoderConfig{
		CallerKey:     "caller_line", // 打印文件名和行数
		LevelKey:      "level_name",
		MessageKey:    "msg",
		TimeKey:       "ts",
		StacktraceKey: "stacktrace",
		LineEnding:    zapcore.DefaultLineEnding,
		EncodeTime:     customTimeEncoder,   // 自定义时间格式
		EncodeLevel:    customLevelEncoder,  // 小写编码器
		EncodeCaller:   customCallerEncoder, // 全路径编码器
		EncodeDuration: zapcore.SecondsDurationEncoder,
		EncodeName:     zapcore.FullNameEncoder,
	}

	// level大写染色编码器
	if l.enableColor {
		encoderConf.EncodeLevel = zapcore.CapitalColorLevelEncoder
	}

	// json 格式化处理
	if l.jsonFormat {
		return zapcore.NewCore(zapcore.NewJSONEncoder(encoderConf),
			syncWriter, zap.NewAtomicLevelAt(l.logMinLevel))
	}

	return zapcore.NewCore(zapcore.NewConsoleEncoder(encoderConf),
		syncWriter, zap.NewAtomicLevelAt(l.logMinLevel))
}

测试

代码语言:txt
AI代码解释
复制
[2021-04-10 18:24:34.329] [INFO] [c9c4eabb-8277-57f7-8465-6176f27d0cef] [service/service.go:52] req=a:3 b:5 multipy result=15

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
3 条评论
热度
最新
感谢分享,我按照您的方法配置,没有输出customCallerEncoder ,请问是什么原因?能否提供源码,感谢!
感谢分享,我按照您的方法配置,没有输出customCallerEncoder ,请问是什么原因?能否提供源码,感谢!
回复回复点赞举报
我用gin做web工程,希望每次request时打印的日志格式里携带traceid,请问每次打印日志时应该怎么传递进去?
我用gin做web工程,希望每次request时打印的日志格式里携带traceid,请问每次打印日志时应该怎么传递进去?
11点赞举报
请问,你能输出traceid吗?
请问,你能输出traceid吗?
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
Go每日一库之87:zap
大多数日志库提供的方式是基于反射的序列化和字符串格式化,这种方式代价高昂,而 Zap 采取不同的方法。
luckpunk
2023/09/30
7680
Go每日一库之87:zap
私有化部署会议系统EasyRTC-SFU内Go语言日志Zap使用教程介绍
企业视频通话会议系统EasyRTC基于网络架构,各分支机构与总部之间使用IP线路连接,在总部部署服务器提供视频调度指挥服务,能够进行视频会议、远程培训、协同工作等沟通。近期更新的新版本EasyRTC-SFU更是在原有基础上进行了升级改造,在系统的集成性、承载量上有更大的提升。
TSINGSEE青犀视频
2021/04/19
8760
手把手,带你从零封装Gin框架(三):日志初始化
本篇来讲一下怎么将日志服务集成到项目中,它也是框架中必不可少的,平时代码调试,线上 Bug 分析都离不开它。这里将使用 zap 作为日志库,一般来说,日志都是需要写入到文件保存的,这也是 zap 唯一缺少的部分,所以我将结合 lumberjack 来使用,实现日志切割归档的功能
用户10002156
2024/01/10
1.3K1
手把手,带你从零封装Gin框架(三):日志初始化
Go 语言怎么使用 zap 日志库?
我们在之前的文章中介绍过标准库 log 包的使用方式,它虽然使用方便,但是它支持的功能比较简单。
frank.
2023/09/08
3650
Go 语言怎么使用 zap 日志库?
Zap高性能日志库实践
Zap 是一个由 Uber 公司开源的结构化、高性能日志记录库,旨在为 Go 语言提供一种快速、简单且高效的日志解决方案。它起源于 Uber 内部使用的日志系统,后来于 2016 年开源,迅速获得了 Go 社区的广泛关注和应用。
FunTester
2024/06/18
2880
Zap高性能日志库实践
Zap日志库并集成Gin
在许多Go语言项目中,我们需要一个好的日志记录器能够提供下面这些功能: 1 . 能够将事件记录到文件中,而不是应用程序控制台; 2 . 日志切割-能够根据文件大小、时间或间隔等来切割日志文件; 3 . 支持不同的日志级别。例如INFO,DEBUG,ERROR等; 4 . 能够打印基本信息,如调用文件/函数名和行号,日志时间等;
iginkgo18
2021/04/23
3.6K0
Go 使用 zap 日志库
zap 是我个人比较喜欢的日志库,是 uber 开源的,有较好的性能。很多开源 Go 项目都使用它作为日志组件。
晓晨
2022/10/04
1K0
Go 使用 zap 日志库
聊聊golang的zap的NewProduction
zap.NewProduction()通过创建NewProductionEncoderConfig再Build出Logger,其中Logger的New方法主要设置了core、errorOutput、addStack属性
code4it
2020/12/05
1620
聊聊golang的zap的NewProduction
从Go log库到Zap,怎么打造出好用又实用的Logger
日志无论对于程序还是程序员都非常重要,有多重要呢,想要长期在公司健健康康的干下去就得学会阶段性划水,阶段性划水的一大关键的就是干活快过预期但是装作。。。不对,这个开头不对劲,下面重来。
KevinYan
2022/10/27
1.1K0
聊聊golang的zap的Core
Core接口内嵌了LevelEnabler,定义了With、Check、Write、Sync方法;它有nopCore及ioCore两种实现,ioCore内嵌了LevelEnabler,定义了Encoder、WriteSyncer(out)属性,其中encoder用来序列化entry为bytes,而WriteSyncer则用于写入bytes。
code4it
2020/12/08
1.1K0
聊聊golang的zap的Core
聊聊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
聊聊golang的zap的encoder
Encoder接口内嵌了ObjectEncoder,定义了Clone、EncodeEntry方法;ObjectEncoder接口定义了各种类型的一系列Add方法;MapObjectEncoder实现了ObjectEncoder接口,内部使用map[string]interface{}来存放数据。
code4it
2020/12/18
5500
聊聊golang的zap的encoder
聊聊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
3180
聊聊golang的zap的NewExample
Golang高性能日志库zap + lumberjack 日志切割组件详解
Zap提供了两种类型的日志记录器 — Sugared Logger 和 Logger
传说之下的花儿
2023/04/16
5.4K0
Golang高性能日志库zap + lumberjack 日志切割组件详解
三个实用细节,让Zap在Go项目中变得更好用
一个项目日志功能够不够健全、记录的日志内容够不够有辨识度直接决定了一个项目维护的难度,你查日志是大海捞针一点点看,还是能够靠一些有辨识度的索引筛选出用户访问程序期间留下的包含了完整上下文的日志直接决定了你搞明白“为什么会这样”所耗费时间的多少。
KevinYan
2024/11/23
1110
三个实用细节,让Zap在Go项目中变得更好用
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
go-kit 微服务 整合zap日志库
zap是Uber开源的一款高性能的日志库,和seelog,logrus相比,高性能是它的突出优势, 已经在业界广泛使用,下面拿官方的性能测试对比原图来说明
Johns
2021/03/22
2.3K0
go-kit 微服务 整合zap日志库
GoLang 日志库 zap 的使用
zap 是 Uber 开源的 go语言的日志库,它的优势在于实时写结构化日志(Structured Logging)到文件有很好的性能。结构化日志就是说相比于直接输出日志文本,使用 json 或者其它编码方式使日志结构化,这样可以方便后续用各种工具分析处理和查找,比如用 ELK(Elasticsearch, Logstash and Kibana)。根据 zap 自己的基准库测试结果,它比其它结构化日志的库(比如我之前使用的 logrus )要有更好的性能。接下来主要介绍一下 zap 库的使用方法。
饶文津
2020/06/15
10.7K0
Go 每日一库之 zap
在很早之前的文章中,我们介绍过 Go 标准日志库log和结构化的日志库logrus。在热点函数中记录日志对日志库的执行性能有较高的要求,不能影响正常逻辑的执行时间。uber开源的日志库zap,对性能和内存分配做了极致的优化。
用户7731323
2020/09/08
1.6K0
相关推荐
Go每日一库之87:zap
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档