之前试用了一下logrus
发现并不是很适合,今天来试用一下排行榜第2位的zap:
这波我们用Zap实现以下功能
- 将Error级别以下的信息写入Info文件
- 将Error级别以上的信息写入Error文件
- 日志按天分割
- 屏幕输出日志
安装
1 | go get -u go.uber.org/zap |
简单配置
Zap提供了两种类型的日志记录器—Sugared Logger
和Logger
。
在性能很好但不是很关键的上下文中,使用SugaredLogger
。它比其他结构化日志记录包快4-10倍,并且支持结构化和printf风格的日志记录。
在每一微秒和每一次内存分配都很重要的上下文中,使用Logger
。它甚至比SugaredLogger
更快,内存分配次数也更少,但它只支持强类型的结构化日志记录。
1 | var zaplog *zap.SugaredLogger |
- 调用
zap.NewProduction()
/zap.NewDevelopment()
或者zap.Example()
创建一个Logger。 - 调用主logger的
. Sugar()
方法来获取一个SugaredLogger
。
开始定制
写入文件
1 | var zaplog *zap.SugaredLogger |
- Encoder:编码器(如何写入日志)。我们将使用开箱即用的
NewJSONEncoder()
,并使用预先设置的ProductionEncoderConfig()
。 - WriterSyncer :指定日志将写到哪里去。我们使用
zapcore.AddSync()
函数并且将打开的文件句柄传进去。 - Log Level:哪种级别的日志将被写入。
将Json格式改为普通文本
1 | func getEncoder() zapcore.Encoder { |
修改时间格式并把级别字段添加颜色
1 | func getEncoder() zapcore.Encoder { |
自定义时间格式
使用zapcore.ISO8601TimeEncoder
格式,还是不是很友好,我想自定义一下,先看看zapcore.ISO8601TimeEncoder
这个函数定义
1 | func ISO8601TimeEncoder(t time.Time, enc PrimitiveArrayEncoder) { |
噢,很简单,我来抄一个
1 | func customTimeEncoder(t time.Time, enc zapcore.PrimitiveArrayEncoder) { |
添加调用者信息
添加打印位置,方便调试
1 | func InitLogger() { |
日志切割
zap本身不带这个功能,我们需要另外的库:
- Lumberjack :按大小切割
- file-rotatelogs :按天切割
我们使用file-rotatelogs
1 | func InitLogger() { |
按级别分文件打印
- 使用
zapcore.NewTee
初始化多个zapcore.NewCore
- 使用
zap.LevelEnablerFunc
过滤写入条件
1 | func InitLogger() { |
增加屏幕输出
1 | func InitLogger() { |
完整测试代码
1 | var zaplog *zap.SugaredLogger |
结合Iris
先初始化一个Logger出来
config/config.go
定义一个log配置的结构体
1 | type LogConfig struct { |
config/logger.go` 根据配置的日志级别,日志路径,日志保留天数初始化一个Logger
1 | package config |
再撸一个中间件打印请求记录middleware/logger_middleware.go
1 | package middleware |
加进路由route/route.go
1 | package route |
好了,就用这个Zap吧