上一篇
如何在Go语言中高效使用日志记录库并快速上手?
- 行业动态
- 2025-05-05
- 1
Go语言标准库log提供基础日志功能,通过New()创建日志实例,支持设置输出位置、前缀和格式,第三方库如logrus支持分级日志,通过SetLevel()设置级别,使用Info()、Error()等方法记录不同严重程度信息,结合JSON格式化便于日志分析处理。
标准库log
基础使用
Go语言内置的log
包提供轻量级日志功能,适合小型项目或快速原型开发。
安装与初始化
无需安装:
import "log"
基础日志输出
func main() { log.Println("常规信息") // 输出到标准错误 log.Fatalln("致命错误并退出程序") // 调用os.Exit(1) log.Panicln("触发panic") // 抛出panic }
自定义配置
func init() { log.SetPrefix("[APP] ") // 添加前缀 log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile) }
logrus库实践
logrus是社区流行的结构化日志库,支持JSON格式和日志分级。
安装
go get github.com/sirupsen/logrus
基础示例
package main import ( "github.com/sirupsen/logrus" ) func main() { log := logrus.New() log.Info("用户登录成功") // 信息级别 log.WithFields(logrus.Fields{ // 结构化日志 "user": "john", "ip": "192.168.1.10", }).Warn("异常登录尝试") }
高级配置
// 设置JSON格式 log.SetFormatter(&logrus.JSONFormatter{}) // 写入文件 file, _ := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) log.SetOutput(file) // 设置最小日志级别 log.SetLevel(logrus.DebugLevel)
高性能库zap实践
Uber开源的zap库以高性能著称,适合高并发场景。
安装
go get go.uber.org/zap
快速使用
func main() { logger, _ := zap.NewProduction() defer logger.Sync() // 确保缓存写入 logger.Info("订单创建成功", zap.String("order_id", "12345"), zap.Float64("amount", 99.9), ) }
自定义配置
cfg := zap.Config{ Encoding: "json", Level: zap.NewAtomicLevelAt(zap.DebugLevel), OutputPaths: []string{"stdout", "/var/log/app.log"}, ErrorOutputPaths: []string{"stderr"}, } logger, _ := cfg.Build()
zerolog极简实践
zerolog专注于零内存分配和链式API,适合对性能要求极高的场景。
安装
go get github.com/rs/zerolog/log
代码示例
func main() { zerolog.TimeFieldFormat = zerolog.TimeFormatUnix log.Info(). Str("service", "payment"). Int("count", 8). Msg("处理支付请求") }
上下文传递
ctx := log.With(). Str("request_id", "abcd1234"). Logger() ctx.Info().Msg("开始处理请求") ctx.Error().Msg("数据库连接失败")
日志库对比与选型建议
特性 | log标准库 | logrus | zap | zerolog |
---|---|---|---|---|
性能 | 高 | 中 | 极高 | 极高 |
结构化日志 | 不支持 | 支持 | 支持 | 支持 |
日志分级 | 不支持 | 支持 | 支持 | 支持 |
学习曲线 | 简单 | 中等 | 中等 | 中等 |
选型建议:
- 原型开发:标准库
log
- 需要结构化日志:logrus/zap
- 微服务/高并发:zap或zerolog
- 云原生环境:选择支持JSON格式的库
最佳实践指南
- 敏感信息过滤:自动屏蔽密码、token等字段
- 日志分级规范:
DEBUG < INFO < WARN < ERROR < FATAL
- 错误日志规范:
log.Error().Err(err).Msg("文件上传失败")
- 日志轮转:使用
lumberjack
等库实现文件切割lumberjackLogger := &lumberjack.Logger{ Filename: "/var/log/app.log", MaxSize: 500, // MB MaxBackups: 3, } log.SetOutput(lumberjackLogger)
引用说明
本文代码示例参考自:
- Go官方文档(https://pkg.go.dev/log)
- logrus GitHub仓库(https://github.com/sirupsen/logrus)
- zap官方指南(https://go.uber.org/zap)
- zerolog文档(https://github.com/rs/zerolog)