Golang zap 快速上手

1.zap 是什么?

zap 是 Uber 开源的一款高性能、结构化、可扩展的日志库。

zap 名称含义是 “Zero Allocation for Production”,即在生产环境中不产生内存分配。

zap 支持多种日志级别、日志输出格式和日志存储方式。

日志级别有 Debug、Info、Warn、Error、DPanic、Panic 和 Fatal。

日志输出格式支持 Text、Console、JSON、YAML。

日志输出方式包括控制台、文件、网络和 Syslog。

Uber zap 具有良好的可扩展性,具有许多配置选项,可以根据不同的需求进行灵活配置,同时也提供了多个插件,可以轻松地集成到其他应用程序中。

Uber zap 还具有较高的安全性,可以安全地记录敏感信息,因为它提供了一些方法来脱敏敏感信息。

基于这些优点,Uber zap 被广泛用于生产环境中的大规模应用程序,例如 Kubernetes、Docker 等。如果您需要高性能、结构化、可扩展的日志包,那么 Uber zap 是一个非常不错的选择。

2.zap 快速上手

1.安装 Zap

使用 Golang Zap 需要先安装它。您可以使用 go get 命令从 GitHub 下载最新版本的 Zap。

go get go.uber.org/zap

2.创建 Logger

在使用 Zap 记录日志前,您需要创建一个 Logger 实例。Logger 是一个核心类型,用于管理日志记录的配置和输出。

logger, err := zap.NewProduction()
if err != nil {
    log.Fatalf("cannot initialize logger: %v", err)
}
defer logger.Sync() // flushes buffer, if any

在上面的示例中,我们创建了一个生产级别的 Logger,它将日志记录到控制台或文件中。

3.配置 Logger

Zap 具有丰富的配置选项,可以帮助您定制日志记录的方式。例如,您可以使用 WithOptions 方法设置日志级别、输出格式、输出位置等选项。

logger, err := zap.NewProduction(zap.WithLevel(zap.DebugLevel))
if err != nil {
    log.Fatalf("cannot initialize logger: %v", err)
}

在上面的示例中,我们将日志级别设置为 Debug。

4.记录日志

使用 Logger 记录日志非常简单。Zap 提供了一些方法,可以让您记录不同级别的日志,包括 Debug、Info、Warn、Error 和 Fatal。

logger.Debug("debug message")
logger.Info("info message")
logger.Warn("warn message")
logger.Error("error message")

您还可以使用 With 方法,向日志记录添加字段信息。

logger.Error("failed to fetch URL",
    zap.String("url", url),
    zap.Duration("backoff", time.Second),
    zap.Error(err)
)

在上面的示例中,我们向日志记录添加了三个字段:url、backoff 和 error。

5.输出日志

Zap 支持多种输出方式,包括控制台、文件、网络等。您可以使用 zapcore.NewCore 方法,创建一个新的日志核心,然后使用 zap.New 方法创建一个新的 Logger 实例。

core := zapcore.NewCore(
    zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()),
    zapcore.AddSync(os.Stdout),
    zap.DebugLevel,
)
logger := zap.New(core)

在上面的示例中,我们将日志输出到控制台,并使用 JSON 格式记录日志。

6.添加 Caller 信息

如果需要输出 caller 信息,可以在创建 Logger 实例时指定。

logger := zap.New(core, zap.AddCaller())

输出的日志中将包含 Logger 调用者的文件名、行号和函数名称来注释每条消息。

当然,也可以自己对日志输出函数再封装一层,以 Logger.Debug() 为例。

func Debug(msg string, fields ...zap.Field) {
	// 回溯 1 层,拿到写日志的调用方的函数信息。
	pc, file, line, _ := runtime.Caller(1)
	funcName := runtime.FuncForPC(pc).Name()
	logger.Debug(msg, zap.String("func", funcName), zap.String("file", file), zap.Int("line", line), fields...)
}

其中 logger 为 Logger 的实例。

需要注意的是,Zap 的性能非常高,并且使用简单,因此它是 Golang 中最受欢迎的日志库之一。但是,由于 Zap 支持的功能非常丰富,因此对于初学者来说,可能需要一些时间来掌握它的高级特性。

3.日志滚动

在实际开发过程中,为了节省磁盘和方便查看,日志需要按照时间或者大小维度进行切割分成多分归档过期的日志,删除久远的日志。这个就是在日常开发中经常遇见的日志滚动(log rotation)。

那么在 Zap 中我们该如何实现这个功能呢? Zap 本身并没有实现滚动日志功能,但是我们可以使用第三方滚动插件实现。

我们可以使用 lumberjack 实现 Zap 的滚动日志,具体实现如下:

package log

import (
	"os"
	"runtime"

	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"gopkg.in/natefinch/lumberjack.v2"
)

var logger *zap.Logger

func init() {
	// 配置日志输出文件
	fileWriter := zapcore.AddSync(&lumberjack.Logger{
		Filename:   "./ota.log",
		MaxSize:    10,    // 单个日志文件最大大小,单位 MB
		MaxBackups: 10,    // 保留的历史日志文件个数
		MaxAge:     30,    // 保留历史日志文件的最大天数
		Compress:   false, // 是否压缩历史日志文件
	})

	// 设置日志级别
	atomicLevel := zap.NewAtomicLevel()
	atomicLevel.SetLevel(zapcore.DebugLevel)

	// 配置日志输出格式
	encoderConfig := zap.NewProductionEncoderConfig()
	encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder

	// 创建核心日志记录器
	core := zapcore.NewCore(
		zapcore.NewJSONEncoder(encoderConfig),
		zapcore.NewMultiWriteSyncer(zapcore.AddSync(os.Stdout), fileWriter),
		atomicLevel,
	)

	// 创建 Logger
	logger = zap.New(core /*, zap.AddCaller()*/)
}

在上面的示例中,我们创建了一个 JSONEncoder 和一个 Core,将日志输出到标准输出,并将 lumberjackLogger 作为 Core 的 WriteSyncer。

需要注意的是,lumberjack 提供了很多配置选项,您可以根据自己的需求进行配置。此外,lumberjack 还支持 gzip 压缩,您可以在 LoggerConfig 中设置 Compress 选项启用压缩功能。最后,lumberjack 会在日志文件达到指定大小、保留时间或数量时,自动轮转日志文件。

4.小结

zap 还有很多高级的用法,如有需要,可以深入研究。

此外,除了 zap,Golang 还有很多好用的日志库,以下是几个比较流行的:

  • log 包

Go语言自带了一个log包,可以满足基本的日志需求。这个包有几个函数:Print、Printf、Println、Fatal、Fatalf、Fatalln、Panic、Panicf、Panicln,可以满足大部分日志的打印和处理需求。

  • logrus

logrus 是一款流行的 Golang 日志库,具有非常灵活的配置选项。它支持多种日志级别、日志格式和输出方式,包括文本格式和 JSON 格式的输出,以及在控制台输出、文件输出、发送到远程服务、发送到 Slack 等。logrus 也可以通过 Hooks 实现日志的异步输出和处理。总的来说,logrus 使用方便,功能齐全,适合大部分项目的日志记录需求。

  • zerolog

zerolog 是一款轻量级的日志库,具有非常好的性能和可扩展性。它支持多种日志级别、输出格式和输出方式,包括console、json、file等等。zerolog 的设计理念是简单、易用、高性能,代码量也比较少。

总的来说,以上几个日志库都具有不同的优点和适用场景,可以根据具体需求选择使用。


参考文献

OpenAI ChatGPT
github.com/uber-go/zap

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值