2025-07-17 09:53PM
zap是Uber开源的go语言高性能日志库,用于高性能场景,提供了结构化日志记录能力,比标准库的'log'包和其他日志更快
1. 主要特点:
1)高性能:zap 针对性能进行了优化,特别是在避免内存分配方面
2)结构化日志:支持输出结构化的日志(如JSON),便于日志分析系统处理
3)日志分级:提供Debug、info、warn、error、DPanic、Panic、Fatal等级别。
4)灵活的配置:可以通过配置来调整日志输出的格式、级别等。
2. zap的使用
2.1 安装
$ go get -u go.uber.org/zap
2.2 导入包
import "go.uber.org/zap"
例如:
package main
// 导入包
import "go.uber.org/zap"
func main() {
// 创建生产环境配置的 Logger(JSON 格式,Info 级别及以上)
logger, _ := zap.NewProduction()
defer logger.Sync() // 确保缓冲区日志被刷新
// 记录结构化日志
logger.Info("User logged in",
zap.String("username", "john"),
zap.Int("attempt", 3),
zap.Bool("success", true),
)
// 错误日志
logger.Error("Failed to connect DB",
zap.String("url", "db://user:pass@host"),
zap.Error(err), // 自动捕获错误信息
)
}
2.3 进阶用法:
2.4 使用 SugaredLogger(简化 API)
logger, _ := zap.NewProduction()
sugar := logger.Sugar() // 创建 SugaredLogger
// 类似 fmt.Printf 的用法
sugar.Infof("User %s logged in (%d attempts)", "john", 3)
// 键值对日志
sugar.Infow("Request completed",
"path", "/api/user",
"status", 200,
"duration", 0.15,
)
2.5 自定义配置
config := zap.Config{
Level: zap.NewAtomicLevelAt(zap.DebugLevel), // 日志级别
Encoding: "json", // 或 "console"
OutputPaths: []string{"stdout", "/tmp/logs.json"}, // 输出目标
EncoderConfig: zapcore.EncoderConfig{
TimeKey: "ts",
LevelKey: "level",
MessageKey: "msg",
EncodeTime: zapcore.ISO8601TimeEncoder, // 时间格式
EncodeLevel: zapcore.CapitalLevelEncoder, // 级别格式
},
}
logger, _ := config.Build()
2.6 全局 logger(谨慎使用)
zap.ReplaceGlobals(logger) // 替换全局 Logger
zap.L().Info("Global log")
2.7 错误处理
logger, err := zap.NewProduction()
if err != nil {
panic(err) // 或 fallback 到其他日志
}
性能关键:
使用 Logger
(非 SugaredLogger)避免反射开销;
复用 zap.Field
对象减少内存分配;
2.8 输出示例:
JSON格式
{
"level": "info",
"ts": 1689876543.123456,
"msg": "User logged in",
"username": "john",
"attempt": 3,
"success": true
}
开发环境格式(Newdevelopment)
2023-07-19T12:34:56.789Z INFO User logged in {username: john, attempt: 3, success: true}
登录
请登录后再发表评论。
评论列表:
目前还没有人发表评论