首页 > 其他分享 >Go 使用 zap 日志库

Go 使用 zap 日志库

时间:2022-09-29 15:58:23浏览次数:49  
标签:zapcore enc syncWriter Go 日志 logger zap

1.前言

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

image-20220929153104876

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"))
}

image-20220929153402709

自定义日志级别显示

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(),不然会造成丢失日志。

效果

image-20220929154425738

标签:zapcore,enc,syncWriter,Go,日志,logger,zap
From: https://www.cnblogs.com/stulzq/p/16741844.html

相关文章

  • log4net 日期和文件大小滚动Composite模式 删除自定义几天前的日志
    官方配置信息Apachelog4net–Apachelog4net:ConfigExamples-Apachelog4net官方示例实现RollingFileAppenderlogging-log4net/DerivedAppender.csat3f2b3......
  • Mongodb图形化工具Mongo Management Studio的初步使用记录
    工具官网下载地址:https://mms.litixsoft.de/ 使用免费版:  创建连接(可以测试下是否能连接) 可连接 点开数据库,点击对应集合 可以看到当前集合的存储数据......
  • K8S服务轻松对接EFK日志系统
    前言在不断更新和进步的的网络时代,相应的各种开发技术都有了较高层次的提升。现在比较流行的是容器集群管理平台(比较出名的是kubernetes),在平台上运行着不同编程语言产出的......
  • MongoDB 4.4 数据库参数详细说明(二) - 一般参数
    1.connPoolMaxShardedConnsPerHost**作用:**设置用于与分片通信的legacy连接池的最大大小。池的大小不会阻止创建其他连接,但是会阻止连接池保留超出此限制的连接。**默认:**2......
  • MongoDB4.4新特性-不再一起发布相关工具
    从4.4版本开始,mongoexport等相关工具不再随着数据库安装包一起发布了,将单独作为一个安装包发布​​MongoDBDatabaseToolsproject:​​(https://docs.mongodb.com/databas......
  • 【Go学习】golang os/exec 执行外部命令
    exec包执行外部命令,它将os.StartProcess进行包装使得它更容易映射到stdin和stdout,并且利用pipe连接i/o.funcLookPath(filestring)(string,error)//LookPath在环境变量......
  • Golang 中的 WaitGroups 指南
    Golang中的WaitGroups指南这个强大功能的简要说明Photoby谢苗鲍里索夫on不飞溅Goroutines是很好用的工具,但是它们有一个问题。在这篇文章中,我们将调查这个问......
  • argocd快速安装
    argocd快速安装基本概要下载安装文件简单修改配置安装服务ingress暴露服务获取登陆密码安装Cli工具1.0下载安装文件#下载文件wgethttps://raw.githubuserc......
  • python sympy模块计算 Clebsch-Gorden 系数
    角动量代数还是挺常用的,今天本想自己写一个python的CG系数函数,又觉得可能已经有现成的包了。google搜了一下,第一条就是sympy官网的相关文档,快准爽。学习了一下官网......
  • Golang Redis有序集合(sorted set)
    Redis有序集合(sortedset)和集合一样也是string类型元素的集合,且不允许重复的成员,不同的是每个元素都会关联一个double类型的分数,这个分数主要用于集合元素排序。引用git......