golang 日志库 zap 使用示例

发布时间: 更新时间: 总字数:923 阅读时间:2m 作者: IP上海 分享 网址

以下是一个使用 Go 语言高性能日志库 zap 的基础示例,包含常用功能说明:

package main

import (
    "go.uber.org/zap"
    "go.uber.org/zap/zapcore"
    "net/http"
    "os"
    "time"
)

func main() {
    // =============== 快速初始化 ===============
    // 生产环境建议配置(结构化JSON格式)
    logger, _ := zap.NewProduction()
    defer logger.Sync() // 将缓存中的日志刷入输出

    // 开发环境配置(易读的控制台格式)
    devLogger, _ := zap.NewDevelopment()
    defer devLogger.Sync()

    logger.Info("这是一个 Production 日志示例")

    // =============== 自定义 Logger ===============
    // 配置编码器
    config := zap.NewProductionConfig()
    config.EncoderConfig.TimeKey = "timestamp"          // 自定义时间字段名
    config.EncoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder // ISO8601 时间格式

    // 自定义日志级别
    config.Level = zap.NewAtomicLevelAt(zap.DebugLevel)

    // 构建 logger
    customLogger, _ := config.Build(
        zap.AddCaller(),      // 记录调用者信息(文件名和行号)
        zap.AddStacktrace(zap.ErrorLevel), // 错误级别及以上记录堆栈
    )
    defer customLogger.Sync()

    // =============== 记录日志 ===============
    // 结构化日志(高性能方式)
    customLogger.Debug("调试信息",
        zap.String("service", "user_service"),
        zap.Int("attempt", 3),
        zap.Duration("backoff", time.Second),
    )

    // 错误记录(自动记录堆栈)
    _, err := http.Get("http://不存在的地址")
    if err != nil {
        customLogger.Error("请求失败",
            zap.Error(err),         // 自动捕获错误信息
            zap.String("url", "http://不存在的地址"),
        )
    }

    // =============== SugaredLogger(更灵活,性能稍低)===============
    sugar := customLogger.Sugar()
    sugar.Infow("Sugar 风格日志",
        "status", "running",
        "duration", time.Second*2,
    )
    sugar.Infof("传统格式化 %s", "样式")

    // =============== 输出到文件 ===============
    // 创建日志文件
    file, _ := os.OpenFile("app.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
    fileSyncer := zapcore.AddSync(file)

    fileLogger := zap.New(
        zapcore.NewCore(
            zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()),
            fileSyncer,
            zap.InfoLevel,
        ),
    )
    defer fileLogger.Sync()

    fileLogger.Info("这条日志将被记录到文件", zap.String("type", "file_log"))
}

关键功能说明

  1. 初始化方式

    • NewProduction():生产环境推荐,JSON 格式,包含 caller 信息
    • NewDevelopment():开发环境使用,彩色控制台输出
  2. 日志级别

    • Debug < Info < Warn < Error < DPanic < Panic < Fatal
  3. 高性能日志记录

    • 使用 zap.Type 字段方法(如 zap.String(), zap.Int()
    • 避免字符串格式化操作(推荐结构化日志)
  4. SugarLogger

    • 通过 logger.Sugar() 转换
    • 支持 printf 风格(性能稍差但更灵活)
  5. 自定义配置

    • 通过 zap.Config 调整时间格式、编码方式等
    • 通过 zapcore 实现自定义输出目标和格式

最佳实践

  1. 生产环境使用 JSON 格式便于日志收集分析
  2. 为不同环境设置不同日志级别(生产环境可设为 Info)
  3. 对性能敏感的代码路径使用非 sugared logger
  4. 使用 zap.Error() 自动记录错误堆栈
  5. 通过 AtomicLevel 实现动态日志级别切换

注意:记得在代码中处理所有可能的错误(示例中简化了错误处理)!

Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数