文章目录
- Go 语言高性能日志神器:zerolog 零基础完全教程
-
- 一、什么是 zerolog?
- 二、安装 zerolog
- 三、快速入门:最简单的 zerolog 示例
-
- 运行结果
- 结果解释
- 四、日志级别(必学)
-
- 完整示例
- 运行结果
- 结果解释
- 五、设置全局日志级别
-
- 运行结果
- 结果解释
- 六、带自定义字段的日志(生产必备)
-
- 运行结果
- 结果解释
- 七、错误日志专用写法(非常实用)
-
- 运行结果
- 结果解释
- 八、控制台美化输出(开发环境)
-
- 运行结果
- 结果解释
- 九、日志输出到文件(基础用法)
-
- 运行结果(app.log 文件)
- 结果解释
- 十、【进阶必备】zerolog + lumberjack 实现日志切割与多目标输出
-
- 1. 安装 lumberjack
- 2. 什么是 lumberjack.v2?
- 3. 基础使用:日志自动切割
-
- 运行结果
- 4. 终极配置:同时输出到控制台 + 切割后的文件
-
- 运行结果
- 5. lumberjack 参数详解
- 十一、全局默认字段(服务名、版本、环境)
-
- 运行结果
- 十二、zerolog 核心用法速查表
- 十三、zerolog 适合什么场景?
- 十四、最终版生产级日志配置(可直接复制使用)
- 十五、总结
Go 语言高性能日志神器:zerolog 零基础完全教程
在 Go 项目开发中,标准库 log 虽然简单易用,但缺少日志分级、结构化 JSON、高性能、自定义字段等生产级必备能力。而 zerolog 是 Go 生态中最流行、性能顶尖的结构化日志库,以「超快速度、极低内存、JSON 格式、简单 API」成为工业级首选。
这篇文章从零带你学会 zerolog,所有示例带运行结果 + 逐行解释,零基础也能直接上手。
一、什么是 zerolog?
zerolog 是 Go 的高性能结构化日志库,核心特点:
适合:所有 Go 生产项目、API 服务、微服务、后台系统。
二、安装 zerolog
一行命令安装:
go get github.com/rs/zerolog/log
三、快速入门:最简单的 zerolog 示例
package main
// 导入 zerolog
import "github.com/rs/zerolog/log"
func main() {
// 最基础的 Info 日志
log.Info().Msg("服务启动成功")
}
运行结果
{"level":"info","message":"服务启动成功","time":"2025-12-18T11:00:00+08:00"}
结果解释
四、日志级别(必学)
zerolog 支持完整 7 级日志,级别从低到高:
Trace → Debug → Info → Warn → Error → Fatal → Panic
完整示例
package main
import "github.com/rs/zerolog/log"
func main() {
log.Trace().Msg("追踪详细流程")
log.Debug().Msg("调试信息")
log.Info().Msg("普通运行信息")
log.Warn().Msg("警告,不影响运行")
log.Error().Msg("错误发生,但程序继续")
log.Fatal().Msg("致命错误,程序退出")
log.Panic().Msg("崩溃错误")
}
运行结果
{"level":"trace","message":"追踪详细流程","time":"2025-12-18T11:05:00+08:00"}
{"level":"debug","message":"调试信息","time":"2025-12-18T11:05:00+08:00"}
{"level":"info","message":"普通运行信息","time":"2025-12-18T11:05:00+08:00"}
{"level":"warn","message":"警告,不影响运行","time":"2025-12-18T11:05:00+08:00"}
{"level":"error","message":"错误发生,但程序继续","time":"2025-12-18T11:05:00+08:00"}
{"level":"fatal","message":"致命错误,程序退出","time":"2025-12-18T11:05:00+08:00"}
结果解释
五、设置全局日志级别
可以设置只输出指定级别以上的日志,生产环境常用。
package main
import (
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
)
func main() {
// 设置全局级别:Info 以上输出(Debug/Trace 不输出)
zerolog.SetGlobalLevel(zerolog.InfoLevel)
log.Debug().Msg("我是调试日志(不会输出)")
log.Info().Msg("我是普通日志(会输出)")
}
运行结果
{"level":"info","message":"我是普通日志(会输出)","time":"2025-12-18T11:10:00+08:00"}
结果解释
- 设置 InfoLevel 后,Debug/Trace 被自动忽略
- 生产环境常用:zerolog.InfoLevel 或 zerolog.WarnLevel
六、带自定义字段的日志(生产必备)
可以给日志加额外字段,如 userID、orderID、error 等。
package main
import "github.com/rs/zerolog/log"
func main() {
userID := 1001
orderID := "ORDER_20251218_001"
log.Info().
Int("user_id", userID). // 整型字段
Str("order_id", orderID). // 字符串字段
Msg("订单创建成功")
}
运行结果
{"level":"info","user_id":1001,"order_id":"ORDER_20251218_001","message":"订单创建成功","time":"2025-12-18T11:15:00+08:00"}
结果解释
- 日志携带业务自定义字段,排查问题超级方便
- 支持:Int / Str / Err / Bool / Float64 等
七、错误日志专用写法(非常实用)
package main
import (
"errors"
"github.com/rs/zerolog/log"
)
func main() {
// 模拟错误
err := errors.New("数据库连接超时")
// 专门记录错误
log.Error().Err(err).Msg("请求处理失败")
}
运行结果
{"level":"error","error":"数据库连接超时","message":"请求处理失败","time":"2025-12-18T11:20:00+08:00"}
结果解释
- .Err(err) 会自动生成 error 字段
- 错误信息清晰,便于监控告警
八、控制台美化输出(开发环境)
默认 JSON 适合生产,开发时可以开启友好格式:
package main
import (
"os"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
)
func main() {
// 控制台美化输出(开发用)
log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr})
log.Info().Str("user_id", "1001").Msg("用户登录成功")
log.Error().Msg("数据库连接失败")
}
运行结果
INF 用户登录成功 user_id=1001 time=2025-12-18T11:25:00+08:00
ERR 数据库连接失败 time=2025-12-18T11:25:00+08:00
结果解释
- 彩色、易读、带级别标识
- 本地开发强烈推荐开启
九、日志输出到文件(基础用法)
默认日志打印在控制台,生产环境需要把日志保存到文件,zerolog 支持直接输出到文件。
package main
import (
"os"
"github.com/rs/zerolog"
)
func main() {
// 打开日志文件
logFile, _ := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
defer logFile.Close()
// 创建日志器
logger := zerolog.New(logFile).With().Timestamp().Logger()
// 输出日志
logger.Info().Msg("服务已启动")
}
运行结果(app.log 文件)
{"level":"info","message":"服务已启动","time":"2025-12-18T11:30:00+08:00"}
结果解释
- 日志直接写入文件
- 支持追加模式,不覆盖历史日志
十、【进阶必备】zerolog + lumberjack 实现日志切割与多目标输出
在实际生产环境中,日志文件如果一直不分割,会越来越大,不仅占用磁盘空间,还会导致日志查看、备份和清理非常麻烦。而 lumberjack.v2 就是 Go 生态中专门解决**日志文件自动切割(轮转)**的库,它可以和 zerolog 完美结合,实现:
- 日志文件按大小自动切割
- 自动保留指定数量的旧日志
- 自动删除过期日志
- 同时支持输出到控制台和文件
1. 安装 lumberjack
go get gopkg.in/natefinch/lumberjack.v2
2. 什么是 lumberjack.v2?
lumberjack.v2 是一个 Go 语言的日志轮转库,核心作用:
3. 基础使用:日志自动切割
package main
import (
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
"gopkg.in/natefinch/lumberjack.v2"
)
func main() {
// 初始化 lumberjack 日志切割器
logWriter := &lumberjack.Logger{
Filename: "./logs/app.log", // 日志文件路径
MaxSize: 100, // 单个文件最大 100MB
MaxBackups: 5, // 最多保留 5 个旧日志文件
MaxAge: 30, // 日志文件最多保留 30 天
Compress: true, // 是否压缩旧日志文件(节省空间)
}
// 绑定到 zerolog
log.Logger = zerolog.New(logWriter).With().Timestamp().Logger()
// 测试日志输出
log.Info().Msg("服务启动成功")
log.Warn().Msg("内存占用过高")
log.Error().Msg("请求处理失败")
}
运行结果
4. 终极配置:同时输出到控制台 + 切割后的文件
在开发时我们需要控制台实时查看日志,生产时又需要日志文件自动切割保存,结合 io.MultiWriter 就能实现两者同时输出。
package main
import (
"io"
"os"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
"gopkg.in/natefinch/lumberjack.v2"
)
func main() {
// 初始化 lumberjack 日志切割器
logWriter := &lumberjack.Logger{
Filename: "./logs/app.log",
MaxSize: 100,
MaxBackups: 5,
MaxAge: 30,
Compress: true,
}
// 控制台美化输出(开发用)
consoleWriter := zerolog.ConsoleWriter{Out: os.Stdout}
// 多目标输出:控制台 + 切割后的日志文件
multiWriter := io.MultiWriter(consoleWriter, logWriter)
// 绑定到 zerolog
log.Logger = zerolog.New(multiWriter).With().Timestamp().Logger()
// 测试日志
log.Info().Str("user_id", "1001").Msg("用户登录成功")
log.Error().Msg("数据库连接超时")
}
运行结果
控制台输出(彩色易读):
INF 用户登录成功 user_id=1001 time=2025-12-18T14:00:00+08:00
ERR 数据库连接超时 time=2025-12-18T14:00:00+08:00
文件输出(JSON 格式,自动切割):
{"level":"info","user_id":"1001","message":"用户登录成功","time":"2025-12-18T14:00:00+08:00"}
{"level":"error","message":"数据库连接超时","time":"2025-12-18T14:00:00+08:00"}
5. lumberjack 参数详解
| Filename | 日志文件的路径和名称 | ./logs/app.log |
| MaxSize | 单个日志文件的最大大小(单位:MB) | 100(超过 100MB 自动切割) |
| MaxBackups | 保留的旧日志文件的最大数量 | 5(最多保留 5 个备份) |
| MaxAge | 日志文件的最大保留天数 | 30(超过 30 天的旧日志会被删除) |
| Compress | 是否压缩旧日志文件 | true(压缩后节省磁盘空间) |
十一、全局默认字段(服务名、版本、环境)
可以给所有日志自动加上固定字段,如服务名、环境、版本。
package main
import (
"os"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
)
func main() {
// 所有日志自动带上服务名、环境
log.Logger = log.Output(os.Stderr).
With().
Str("service", "order-service").
Str("env", "production").
Logger()
log.Info().Msg("订单服务运行中")
}
运行结果
{"level":"info","service":"order-service","env":"production","message":"订单服务运行中","time":"2025-12-18T11:35:00+08:00"}
十二、zerolog 核心用法速查表
| log.Trace().Msg("") | 追踪日志 |
| log.Debug().Msg("") | 调试日志 |
| log.Info().Msg("") | 普通信息 |
| log.Warn().Msg("") | 警告 |
| log.Error().Err(err).Msg("") | 错误 |
| log.Fatal().Msg("") | 致命错误(退出) |
| zerolog.SetGlobalLevel | 设置全局级别 |
| .Str("key", "val") | 添加字符串字段 |
| .Int("key", 123) | 添加整数字段 |
| zerolog.ConsoleWriter | 控制台美化 |
| lumberjack.Logger | 日志文件自动切割 |
| io.MultiWriter | 同时输出到多个目标 |
十三、zerolog 适合什么场景?
✅ 强烈推荐使用
❌ 不适合
十四、最终版生产级日志配置(可直接复制使用)
package main
import (
"io"
"os"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
"gopkg.in/natefinch/lumberjack.v2"
)
func init() {
// 初始化日志切割器
logWriter := &lumberjack.Logger{
Filename: "./logs/app.log",
MaxSize: 100,
MaxBackups: 5,
MaxAge: 30,
Compress: true,
}
// 控制台美化输出(仅开发环境使用,生产可关闭)
consoleWriter := zerolog.ConsoleWriter{Out: os.Stdout}
// 多目标输出
multiWriter := io.MultiWriter(consoleWriter, logWriter)
// 配置 zerolog
log.Logger = zerolog.New(multiWriter).
With().
Timestamp().
Str("service", "order-service").
Str("env", "production").
Logger()
// 设置全局日志级别
zerolog.SetGlobalLevel(zerolog.InfoLevel)
}
func main() {
log.Info().Msg("订单服务启动成功")
log.Warn().Msg("订单队列积压")
log.Error().Msg("支付回调处理失败")
}
十五、总结
学会 zerolog + lumberjack,你的日志系统直接达到工业级标准!
