golang开发:类库篇(一) Zap高性能日志类库的使用
为什么要用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高性能日志类库的使用相关推荐
- mysql 开发进阶篇系列 41 mysql日志之慢查询日志
一.概述 慢查询日志记录了所有的超过sql语句( 超时参数long_query_time单位 秒),获得表锁定的时间不算作执行时间.慢日志默认写入到参数datadir(数据目录)指定的路径下.默认文件 ...
- golang高性能日志库zap的使用
本文作者:陈进坚 个人博客:https://jian1098.github.io CSDN博客:https://blog.csdn.net/c_jian 简书:https://www.jianshu. ...
- 深度|从Go高性能日志库zap看如何实现高性能Go组件
导语:zap是uber开源的Go高性能日志库.本文作者深入分析了zap的架构设计和具体实现,揭示了zap高效的原因.并且对如何构建高性能Go语言库给出自己的建议. 作者简介:李子昂,美图公司架构平台系 ...
- 深度 | 从Go高性能日志库zap看如何实现高性能Go组件
导语:zap是uber开源的Go高性能日志库.本文作者深入分析了zap的架构设计和具体实现,揭示了zap高效的原因.并且对如何构建高性能Go语言库给出自己的建议. 作者简介:李子昂,美图公司架构平台系 ...
- Golang开发环境搭建-Vim篇
Golang开发环境搭建-Vim篇 转自:http://tonybai.com/2014/11/07/golang-development-environment-for-vim/ 虽说sublime ...
- Android高性能日志模块-Xlog 正篇
Android高性能日志模块-Xlog 前言 日志可以帮助我们定位问题,记录当前程序的运行状态.与后端开发不同的是,Android中的Log原生支持的仅是本地调试和信息记录,并不能很方便地定位远程问题 ...
- golang框架gin的日志处理和zap lumberjack日志使用
目录 gin自带日志 新建logger.go mian.go 引用 zap lumberjack接管gin日志 新建logger.go main.go 调用 gin框架好用,轮子也多,我也来丰富下内容 ...
- 一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-通过SQL实现特殊业务...
前面的四篇文章演示ORM的一些常规操作与配置,通过前面的文章,应用开发人员要可以使用ORM开发出简单的应用,但是,ORM也不是万能钥匙,在业务应用中,还有很多是ORM解决不了的问题,对于这些问题,我们 ...
- 一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-演示ORM中的查询
前文回顾 前面的文章一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-演示ORM的基本操作一文给大家介绍了如果使用ORM实现数据的读取.插入.更新与删除基本业务也讲解了ORM开发基 ...
最新文章
- 08CSS的复合选择器
- ASP隐藏文件地址,并在下载时替换文件名
- Java正则表达式代码案例
- iOS开发CoreAnimation解读之一——初识CoreAnimation核心动画编程
- 设计模式------中介者模式
- leetcode203 移除链表元素
- oracle procedure可以执行非常复杂的语句吗,oracle-存储过程(procedure)
- 哔哩哔哩---WPF入门基础教程(合集)
- python 学习目录
- 10大城市硬科技指数发布,“硬科技+在大西安”高峰论坛圆满落幕
- matlab textscan 分块读取,【转】matlab的textscan与textread区别
- win10计算机管理中没有本地用户和组怎么办
- php相亲段子,个个都是老司机!NPC段子手们经典语录
- 移动物联网卡APN如何设置?
- 计算机组成与体系结构(软件设计师考试)
- 联想y7000p 2019 安装ubuntu20.04 双系统 设置efi分区
- Qt大屏电子看板系统源码基础版
- 松下Megacon叠屏液晶电视有声音没图像怎么修理
- win8输入法 找回中文简体下的美式键盘输入法
- ubuntu开启TFTP服务和NFS服务