登录 主页

go - zap 日志的使用

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}  

返回>>

登录

请登录后再发表评论。

评论列表:

目前还没有人发表评论