为什么要用zap来写日志

原来是写PHP的,一直用的error_log,第一次写Go项目的时候,还真不知道该怎么写日志,后来就按照PHP的写法自己不成规范的捣鼓写。去了新公司之后,发现用的是zap。后来查询 了解了下zap,前同事反应他们很多大公司都在使用zap写日志,GitHub上star 高达7K多,足以说明它受欢迎的程度。

1.zap是Uber开源的日志库;
2.很多大的公司和小的公司都在使用;
3.跟seelog、logrus等类库相比,高性能是它最突出的优势;
我想以上几个原因就已经说明了它的广泛性、稳定性,就值得我们去尝试。

怎么使用zap

我们说下简单的使用案例
首相当然是下载
go get -u go.uber.org/zap
先贴一个我这边常用的zap的配置

zap.Config{Level:       zap.NewAtomicLevelAt(zap.DebugLevel),Development: true,Encoding:    "json",EncoderConfig: zapcore.EncoderConfig{TimeKey:        "t",LevelKey:       "level",NameKey:        "log",CallerKey:      "caller",MessageKey:     "msg",StacktraceKey:  "trace",LineEnding:     zapcore.DefaultLineEnding,EncodeLevel:    zapcore.LowercaseLevelEncoder,EncodeTime:     时间格式函数,EncodeDuration: zapcore.SecondsDurationEncoder,EncodeCaller:   zapcore.ShortCallerEncoder,},OutputPaths:      []string{"/tmp/zap.log"},ErrorOutputPaths: []string{"/tmp/zap.log"},InitialFields: map[string]interface{}{"app": "test",},}

基本配置的说明

Level:日志级别,跟其他语言是一样的。只不过它需要的类型是AtomicLevel。所以需要使用zap.NewAtomicLevelAt做下如下的转化。

zap.NewAtomicLevelAt(zap.DebugLevel)
zap.DebugLevel
zap.InfoLevel
zap.WarnLevel
zap.ErrorLevel

Development:bool 是否是开发环境。如果是开发模式,对DPanicLevel进行堆栈跟踪
DisableCaller:bool 禁止使用调用函数的文件名和行号来注释日志。默认进行注释日志
DisableStacktrace:bool 是否禁用堆栈跟踪捕获。默认对Warn级别以上和生产error级别以上的进行堆栈跟踪。
Encoding:编码类型,目前两种json 和 console【按照空格隔开】,常用json
EncoderConfig:生成格式的一些配置–TODO 后面我们详细看下EncoderConfig配置各个说明
OutputPaths:[]string 日志写入文件的地址
ErrorOutputPaths:[]string 将系统内的error记录到文件的地址
InitialFields:map[string]interface{} 加入一些初始的字段数据,比如项目名
当然了,如果想控制台输出,OutputPaths和ErrorOutputPaths不能配置为文件地址,而应该改为stdout。

关于config的配置,具体的可以参考文件里面的注释
go.uber.org/zap/config.go
type Config struct

EncoderConfig配置说明

MessageKey:输入信息的key名
LevelKey:输出日志级别的key名
TimeKey:输出时间的key名
NameKey CallerKey StacktraceKey跟以上类似,看名字就知道
LineEnding:每行的分隔符。基本zapcore.DefaultLineEnding 即"\n"
EncodeLevel:基本zapcore.LowercaseLevelEncoder。将日志级别字符串转化为小写
EncodeTime:输出的时间格式
EncodeDuration:一般zapcore.SecondsDurationEncoder,执行消耗的时间转化成浮点型的秒
EncodeCaller:一般zapcore.ShortCallerEncoder,以包/文件:行号 格式化调用堆栈
EncodeName:可选值。

具体EncoderConfig的说明,可以参考文件里面的注释
go.uber.org/zapcore/encoder.go
type EncoderConfig struct

举个栗子

你扯这么多配置说明,谁有时间看这玩意,写个常用的让大家照着用就好了嘛。

package mainimport ("fmt""go.uber.org/zap""go.uber.org/zap/zapcore""time"
)var logger *zap.Logger
func formatEncodeTime(t time.Time, enc zapcore.PrimitiveArrayEncoder) {enc.AppendString(fmt.Sprintf("%d%02d%02d_%02d%02d%02d", t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute(), t.Second()))
}func FormateLog(args []interface{}) *zap.Logger {log := logger.With(ToJsonData(args))return log
}func Debug(msg string, args ...interface{}) {FormateLog(args).Sugar().Debugf(msg)
}func ToJsonData(args []interface{}) zap.Field {det := make([]string, 0)if len(args) > 0 {for _, v := range args {det = append(det, fmt.Sprintf("%+v", v))}}zap := zap.Any("detail", det)return zap
}func InitZapLog() {cfg := zap.Config{Level:       zap.NewAtomicLevelAt(zap.DebugLevel),Development: true,Encoding:    "json",EncoderConfig: zapcore.EncoderConfig{TimeKey:        "t",LevelKey:       "level",NameKey:        "logger",CallerKey:      "caller",MessageKey:     "msg",StacktraceKey:  "trace",LineEnding:     zapcore.DefaultLineEnding,EncodeLevel:    zapcore.LowercaseLevelEncoder,EncodeTime:     formatEncodeTime,EncodeDuration: zapcore.SecondsDurationEncoder,EncodeCaller:   zapcore.ShortCallerEncoder,},OutputPaths:      []string{"/tmp/zap.log"},ErrorOutputPaths: []string{"/tmp/zap.log"},InitialFields: map[string]interface{}{"app": "test",},}var err errorlogger, err = cfg.Build()if err != nil {panic("log init fail:" + err.Error())}
}func main() {InitZapLog()defer logger.Sync()a := []string{"test","hello","world"}Debug("output",a)
}

执行下,就会在日志文件上输入按照我们配置日志格式。

tail -f /tmp/zap.log
{"level":"debug","t":"20190630_044053","caller":"myproject/main.go:21","msg":"output","app":"test","detail":["[test hello world]"]}

然后我们试下控制台输出,修改三个console相关的配置代码
···
OutputPaths: []string{“stdout”},
ErrorOutputPaths: []string{“stdout”},
控制台窗口就会输出
{“level”:“debug”,“t”:“20190630_092533”,“caller”:“myproject/main.go:21”,“msg”:“output”,“app”:“test”,“detail”:["[test hello world]"]}
···

当然了,zap最想的使用和文档,看官网嘛
https://github.com/uber-go/zap
https://godoc.org/go.uber.org/zap

golang开发:类库篇(一) Zap高性能日志类库的使用相关推荐

  1. mysql 开发进阶篇系列 41 mysql日志之慢查询日志

    一.概述 慢查询日志记录了所有的超过sql语句( 超时参数long_query_time单位 秒),获得表锁定的时间不算作执行时间.慢日志默认写入到参数datadir(数据目录)指定的路径下.默认文件 ...

  2. golang高性能日志库zap的使用

    本文作者:陈进坚 个人博客:https://jian1098.github.io CSDN博客:https://blog.csdn.net/c_jian 简书:https://www.jianshu. ...

  3. 深度|从Go高性能日志库zap看如何实现高性能Go组件

    导语:zap是uber开源的Go高性能日志库.本文作者深入分析了zap的架构设计和具体实现,揭示了zap高效的原因.并且对如何构建高性能Go语言库给出自己的建议. 作者简介:李子昂,美图公司架构平台系 ...

  4. 深度 | 从Go高性能日志库zap看如何实现高性能Go组件

    导语:zap是uber开源的Go高性能日志库.本文作者深入分析了zap的架构设计和具体实现,揭示了zap高效的原因.并且对如何构建高性能Go语言库给出自己的建议. 作者简介:李子昂,美图公司架构平台系 ...

  5. Golang开发环境搭建-Vim篇

    Golang开发环境搭建-Vim篇 转自:http://tonybai.com/2014/11/07/golang-development-environment-for-vim/ 虽说sublime ...

  6. Android高性能日志模块-Xlog 正篇

    Android高性能日志模块-Xlog 前言 日志可以帮助我们定位问题,记录当前程序的运行状态.与后端开发不同的是,Android中的Log原生支持的仅是本地调试和信息记录,并不能很方便地定位远程问题 ...

  7. golang框架gin的日志处理和zap lumberjack日志使用

    目录 gin自带日志 新建logger.go mian.go 引用 zap lumberjack接管gin日志 新建logger.go main.go 调用 gin框架好用,轮子也多,我也来丰富下内容 ...

  8. 一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-通过SQL实现特殊业务...

    前面的四篇文章演示ORM的一些常规操作与配置,通过前面的文章,应用开发人员要可以使用ORM开发出简单的应用,但是,ORM也不是万能钥匙,在业务应用中,还有很多是ORM解决不了的问题,对于这些问题,我们 ...

  9. 一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-演示ORM中的查询

    前文回顾 前面的文章一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-演示ORM的基本操作一文给大家介绍了如果使用ORM实现数据的读取.插入.更新与删除基本业务也讲解了ORM开发基 ...

最新文章

  1. 08CSS的复合选择器
  2. ASP隐藏文件地址,并在下载时替换文件名
  3. Java正则表达式代码案例
  4. iOS开发CoreAnimation解读之一——初识CoreAnimation核心动画编程
  5. 设计模式------中介者模式
  6. leetcode203 移除链表元素
  7. oracle procedure可以执行非常复杂的语句吗,oracle-存储过程(procedure)
  8. 哔哩哔哩---WPF入门基础教程(合集)
  9. python 学习目录
  10. 10大城市硬科技指数发布,“硬科技+在大西安”高峰论坛圆满落幕
  11. matlab textscan 分块读取,【转】matlab的textscan与textread区别
  12. win10计算机管理中没有本地用户和组怎么办
  13. php相亲段子,个个都是老司机!NPC段子手们经典语录
  14. 移动物联网卡APN如何设置?
  15. 计算机组成与体系结构(软件设计师考试)
  16. 联想y7000p 2019 安装ubuntu20.04 双系统 设置efi分区
  17. Qt大屏电子看板系统源码基础版
  18. 松下Megacon叠屏液晶电视有声音没图像怎么修理
  19. win8输入法 找回中文简体下的美式键盘输入法
  20. ubuntu开启TFTP服务和NFS服务

热门文章

  1. win2003访问不了网络计算机,win2003没法连接局域网其它用户!
  2. npm不是内部命令或外部命令
  3. Challenging Common Assumptions in the Unsupervised Learning of Disentangled Representations学习与理解
  4. 读《把时间当作朋友》
  5. Heat-AutoScaling
  6. 糖尿病逆糖计划:均衡饮食是科学合理的膳食原则
  7. 不知道图片变漫画怎么弄?来跟我学这几个简单的方法
  8. Openstack 之镜像管理服务Glance
  9. 物理cpu和逻辑cpu的区别
  10. Vulnhub Empire Breakout