简介

在开发过程中 会使用到日志库去记录错误的日志,尤其是golang中 有无穷无尽的error 如果不记录,当你的代码出错,就无从排错了。
zap 是开源的 Go 高性能日志库 主要有以下特点:

  1. 支持不同的日志级别
  2. 能够打印基本信息等但不支持日志的分割 但是可以使用 lumberjack 也是 zap 官方推荐用于日志分割

官网:GitHub - uber-go/zap: Blazing fast, structured, leveled logging in Go.zap package - go.uber.org/zap - Go Packages

安装

go get -u go.uber.org/zap

zap只支持Go的两个最新小版本。

日志记录器 logger和 sugared logger

zap库的使用与其他的日志库非常相似。先创建一个logger,然后调用各个级别的方法记录日志
而 zap库给我们提供两种模式的日志记录

  1. Logger
  2. Sugared Logger
    至于你想问他们之间有什么区别,很简单,我们先来看代码
    这里我就直接用官网的例用代码了

Logger

logger, _ := zap.NewProduction()
defer logger.Sync()
logger.Info("failed to fetch URL",// Structured context as strongly typed Field values.zap.String("url", "https://www.baidu.com"),zap.Int("attempt", 3),zap.Duration("backoff", time.Second),
)


说实话我是很不喜欢logger模式的日志的
调用起来是真的麻烦 还要指定 int类型 string类型 这个类型那个类型
但优点也很明显那就是 而且内存分配少性能至上

Sugared Logger

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", "https://www.baidu.com","attempt", 3,"backoff", time.Second,
)
sugar.Infof("Failed to fetch URL: %s", "https://www.baidu.com")

这种就是printf风格的调用起来方便即开即用

Example 和 Production 以及development

Example

log := zap.NewExample()
log.Debug("this is debug message")
log.Info("this is info message")
log.Info("this is info message with fileds",zap.Int("age", 24), zap.String("agender", "man"))
log.Warn("this is warn message")
log.Error("this is error message")
log.Panic("this is panic message")

结果

Production

log, _ := zap.NewProduction()
log.Debug("this is debug message")
log.Info("this is info message")
log.Info("this is info message with fileds",zap.Int("age", 24), zap.String("agender", "man"))
log.Warn("this is warn message")
log.Error("this is error message")
log.Panic("this is panic message")

结果

NewDevelopment

log, _ := zap.NewDevelopment()
log.Debug("this is debug message")
log.Info("this is info message")
log.Info("this is info message with fileds",zap.Int("age", 24), zap.String("agender", "man"))
log.Warn("this is warn message")
log.Error("this is error message")
log.Panic("this is panic message")

结果

三者对比

由上文可见
Example和Production使用的是json格式
而development使用行的形式
除此之外
Example和Production 所输出的多少也不一样。

具体如下:

Development

  • 从警告级别向上打印到堆栈中来跟踪
  • 始终打印包/文件/行(方法)
  • 在行尾添加任何额外字段作为json字符串
  • 以大写形式打印级别名称
  • 以毫秒为单位打印ISO8601格式的时间戳

Production

  • 调试级别消息不记录
  • Error,Dpanic级别的记录,会在堆栈中跟踪文件,warn不会
  • 始终将调用者添加到文件中
  • 以时间戳格式打印日期
  • 以小写形式打印级别名称

调整日志输出的 格式

如下文代码所示

func getEncoder() zapcore.Encoder {encoderConfig := zap.NewDevelopmentEncoderConfig(){// LevelKey值变为 levelencoderConfig.LevelKey = "level"// MessageKey值变为 msgencoderConfig.MessageKey = "msg"// TimeKey值 变成timeencoderConfig.TimeKey = "time"// 把输出的info 变成INFO 只需要丢对象 不许执行encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder// 对时间进行格式化处理encoderConfig.EncodeTime = func(t time.Time, encoder zapcore.PrimitiveArrayEncoder) {encoder.AppendString(t.Local().Format("2006-01-02 15:04:05"))}}return zapcore.NewJSONEncoder(encoderConfig)
}

如上代码所示,可以调节任意位置,我注释也标的很清楚

使用lumberjack进行配合

官网: lumberjack package - gopkg.in/natefinch/lumberjack.v2 - Go Packages
zap没有切割日志的功能,所以我们必须借助第三方库来实现

使用

要将 lumberjack 与标准库的日志包一起使用,只需在应用程序启动时将其传递到 SetOutput 函数中即可。

log.SetOutput(&lumberjack.Logger{Filename:   "/var/log/myapp/foo.log",MaxSize:    500, // megabytesMaxBackups: 3,MaxAge:     28, //daysCompress:   true, // disabled by default
})

如果要和Zap所结合的话 需要放入到zapcore.AddSync中

zapcore.AddSync(&lumberjack.Logger{Filename:   "/var/log/myapp/foo.log",MaxSize:    500, // megabytesMaxBackups: 3,MaxAge:     28, //daysCompress:   true, // disabled by default
})

声明日志并且初始化使用

我们上文以及配置好了日志的格式以及规定了日志输出的位置 也做好了 lumberjack日志的切割
那我们该如何初始化呢
只需要声明core 然后把这三个丢进去即可
如下代码所示

core := zapcore.NewCore(getEncoder(), zapcore.NewMultiWriteSyncer(zapcore.AddSync(&lumberjack.Logger{Filename:   "/var/log/myapp/foo.log",MaxSize:    500, // megabytesMaxBackups: 3,MaxAge:     28, //daysCompress:   true, // disabled by default
}) , zapcore.AddSync(os.Stdout)), zapcore.DebugLevel)
zap.New(core).Sugar()

当然 会发现 我还加了一个值 zapcore.AddSync(os.Stdout))
这句代码是代表除了输出到文件中还会输出到终端中,完成多个终端的输出

完整代码 日志库初始化组件

package confimport ("fmt""github.com/natefinch/lumberjack""github.com/spf13/viper""go.uber.org/zap""go.uber.org/zap/zapcore""os""path/filepath""time"
)func InitLogger() *zap.SugaredLogger {logMode := zapcore.InfoLevelif viper.GetBool("model.development") {logMode = zapcore.DebugLevel}// 第一个参数是输出的格式 第二个参数 输出的位置//zapcore.NewMultiWriteSyncer 输出到多个终端 比如 文件 console中core := zapcore.NewCore(getEncoder(), zapcore.NewMultiWriteSyncer(getWriterSyncer(), zapcore.AddSync(os.Stdout)), logMode)return zap.New(core).Sugar()
}// def 输出日志的格式
func getEncoder() zapcore.Encoder {encoderConfig := zap.NewDevelopmentEncoderConfig(){// LevelKey值变为 levelencoderConfig.LevelKey = "level"// MessageKey值变为 msgencoderConfig.MessageKey = "msg"// TimeKey值 变成timeencoderConfig.TimeKey = "time"// 把输出的info 变成INFO 只需要丢对象 不许执行encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder// 对时间进行格式化处理encoderConfig.EncodeTime = func(t time.Time, encoder zapcore.PrimitiveArrayEncoder) {encoder.AppendString(t.Local().Format("2006-01-02 15:04:05"))}}return zapcore.NewJSONEncoder(encoderConfig)
}// def 日志要输出到什么地方
func getWriterSyncer() zapcore.WriteSyncer {stSeparator := string(filepath.Separator)stRootDir, _ := os.Getwd()stLogFilePath := stRootDir + stSeparator + "log" + stSeparator + time.Now().Format("2006-01-02") + ".log"fmt.Println(stLogFilePath)// 日志分割hook := lumberjack.Logger{Filename:   stLogFilePath,                  // 日志文件路径,默认 os.TempDir()MaxSize:    viper.GetInt("log.MaxSize"),    // 每个日志文件保存500M,默认 100MMaxBackups: viper.GetInt("log.MaxBackups"), // 保留3个备份,默认不限MaxAge:     viper.GetInt("log.MaxAge"),     // 保留28天,默认不限Compress:   viper.GetBool("log.Compress"),  // 是否压缩,默认不压缩}return zapcore.AddSync(&hook)
}

Golang一日一库之 日志库 zap相关推荐

  1. C++plog库,轻量级日志框架(日志库)

    文章目录 为何建议程序员在项目中使用第三方日志库 第三方日志库plog的优势 plog主要头文件及使用方法解释 plog/Log.h plog/Appenders/ColorConsoleAppend ...

  2. Python日志库logging、loguru、Eliot

    文章目录 简介 初试 日志基础教程 消息格式 日志属性 信息流程 通过配置文件创建 PyCharm日志插件 封装 loguru入门 Eliot入门 参考文献 简介 logging,Python内置库, ...

  3. Golang高性能日志库zap + lumberjack 日志切割组件详解

    文章篇幅较长,可以先收藏防止迷路~ 目录 zap日志库 1. why zap? 2. 简单使用 3. 自定义logger例子 4. Gin项目使用zap 6. lumberjack 日志切割组件 za ...

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

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

  5. Golang日志库Zap基本使用

    Zap Uber-go Zap简介 Zap Logger Logger Sugared Logger 配置Logger New函数详情 JSON Encoder Log Encoder 更改时间编码 ...

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

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

  7. go日志库log/zap/logrus

    一个好的日志记录器能够提供下面这些功能: 能够将事件记录到文件中,而不是应用程序控制台. 日志切割-能够根据文件大小.时间或间隔等来切割日志文件. 支持不同的日志级别.例如INFO,DEBUG,ERR ...

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

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

  9. 【Go进阶】如何让你Go项目中日志清晰有趣-Zap日志库

    本文先介绍了Go语言原生的日志库的使用,然后详细介绍了非常流行的Uber开源的zap日志库,同时介绍了如何搭配Lumberjack实现日志的切割和归档. Zap日志库在Go语言项目中的使用 在许多Go ...

最新文章

  1. OPPO R9s在哪里开启Usb调试模式的完美步骤
  2. python界面图片-python图形用户界面(六):可视化给图片添加上文字
  3. 09_ClickHouse,ReplacingMergeTree,案例,根据排序键去重,使用版本参数的去重(学习笔记)
  4. JS正则表达式详解(转)
  5. 【洛谷】P3919 【模板】可持久化线段树(主席树)
  6. [蓝桥杯][2018年第九届真题]倍数问题(贪心+思维)
  7. 将sublime text3添加到右键菜单中(可执行)
  8. [UE4]报错:Material with missing usage flag was applied to skeletal mesh 的解决方法:为材质设置相应的 usage flag
  9. java 阿里线程池_为什么阿里不允许使用 Executors 创建线程池?
  10. 人生只有两条路径才能实现财富自由
  11. 阶段3 3.SpringMVC·_06.异常处理及拦截器_1 SpringMVC异常处理之分析和搭建环境
  12. Scrapy框架之日志等级
  13. 2019网易校招笔试题 瞌睡
  14. js 实现图片放大镜原理
  15. 微信一键连wifi服务器,微信小程序一键连wifi
  16. LaTeX入门学习(8)(术语)
  17. 【Unity3D】人物跟随鼠标位置
  18. 【真题分享】2021京东春招java开发面试
  19. 【面经】上汽 智能驾驶中心
  20. 导入/导出dBase

热门文章

  1. 伊利诺理工大学计算机专业,美国伊利诺伊理工大学世界排名_专业_申请条件-PSONE品思...
  2. SpringBoot利用Aop打印入参出参日志
  3. 一些软件黑盒测试工具列表
  4. ASEMI代理AD9951YSVZ原装ADI车规级AD9951YSVZ
  5. 用python判断闰年
  6. 金融科技之:农业供应链金融系统平台建设方案分享
  7. Powerpivot PowerBI相关组件下载安装(附操作截图)
  8. 内网渗透(六十一)之Kerberosating攻击
  9. 模糊搜索——Vue单页面-Element UI
  10. Xilinx 7系列FPGA之Virtex-7产品简介