以下是一个使用 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"))
}
关键功能说明:
初始化方式:
NewProduction()
:生产环境推荐,JSON 格式,包含 caller 信息NewDevelopment()
:开发环境使用,彩色控制台输出
日志级别:
- Debug < Info < Warn < Error < DPanic < Panic < Fatal
高性能日志记录:
- 使用
zap.Type
字段方法(如 zap.String()
, zap.Int()
) - 避免字符串格式化操作(推荐结构化日志)
SugarLogger:
- 通过
logger.Sugar()
转换 - 支持
printf
风格(性能稍差但更灵活)
自定义配置:
- 通过
zap.Config
调整时间格式、编码方式等 - 通过
zapcore
实现自定义输出目标和格式
最佳实践:
- 生产环境使用 JSON 格式便于日志收集分析
- 为不同环境设置不同日志级别(生产环境可设为 Info)
- 对性能敏感的代码路径使用非 sugared logger
- 使用
zap.Error()
自动记录错误堆栈 - 通过
AtomicLevel
实现动态日志级别切换
注意:记得在代码中处理所有可能的错误(示例中简化了错误处理)!