golang第三方包zap

Posted by didphp.com

介绍

zapUber推出的一个日志包,性能出色

查看源码

查看文档

安装

go get -u go.uber.org/zap

使用

zap提供了3种快速创建logger的方法,2种格式化输出类型

创建logger

创建logger的方法有3种,详细程度zap.NewProduction() > zap.NewDevelopment() > zap.NewExample()

支持的日志级别有: debuginfowarnerrorfatal

zap.NewProduction()

用于生产环境,返回 json 格式的数据

logger, _ := zap.NewProduction()
  • 日志级别默认不支持debug

zap.NewDevelopment()

用于开发环境,返回的数据中最后一部分自定义内容是 json 格式

logger, _ := zap.NewDevelopment()

zap.NewExample()

用于本机开发调试,不包含时间信息

logger := zap.NewExample()

格式化输出

2种格式化输出类型: LoggerSugaredLogger

输出的常用方法有: Debug()Info()Warn()Error()Fatal()

常用方法后面会接不同字母,如: wfln,如Infow()Warnf()、“Errorln()`等,存在字母后缀的方法只是输出格式不同而已

  • 需要注意的是Fatal()是输出后中断程序

Logger

Logger支持结构化和强类型,用在性能和类型安全很重要时,输出参数是强类型

logger, _ := zap.NewProduction()
defer logger.Sync()
logger.Info("failed to fetch URL",
    zap.String("url", url),
    zap.Int("attempt", 3),
    zap.Duration("backoff", time.Second),
)
  • zap底层有缓冲,在任何情况下都执行defer logger.Sync()

Info中结构化中的字段是强类型,不是松散类型,使用Any方法可以支持任意类型模拟松散类型

logger.Info("failed to fetch URL",
    zap.Any("url", url),
    zap.Any("attempt", 3),
    zap.Any("backoff", time.Second),
)

SugaredLogger

SugaredLogger支持结构化和printf格式语句,用在需要性能但安全不是很重要时,输出参数是松散类型

Logger变更为SugaredLogger,就是logger之后执行logger.Sugar()

logger, _ := zap.NewProduction()
defer logger.Sync()
sugar := logger.Sugar()
sugar.Infow("failed to fetch URL",
    "url", url,
    "attempt", 3,
    "backoff", time.Second,
)
sugar.Infof("Failed to fetch URL: %s", url)
  • zap底层有缓冲,在任何情况下都执行defer logger.Sync()