本文介绍使用 lumberjack 库为 go 标准 log 包添加跨平台日志轮转能力,满足生产环境对自动切分、备份、过期清理等需求,同时兼容 linux 与 windows 系统。
在构建长期运行的 Go Web 应用(如部署于远程服务器的 API 服务或后台任务)时,可靠的日志记录是调试、监控与审计的关键。Go 标准库的 log 包简单易用,但原生不支持日志轮转(log rotation)——即按大小、时间或数量自动切分、归档与清理旧日志。若手动实现轮转逻辑,不仅易出错,还难以兼顾跨平台一致性(如 Windows 与 Linux 的文件锁、路径分隔符、权限模型差异)。
此时,lumberjack 是业界广泛采用的轻量级、零依赖、纯 Go 实现的日志轮转封装器。它专为无缝集成 log.Logger 而设计,完全兼容标准库,无需修改已有日志调用代码,且天然支持 Windows 和类 Unix 系统。
安装 lumberjack(推荐使用 Go Modules):
go get github.com/natefinch/lumberjack
导入并配置 Logger:
package main
import (
"log"
"os"
"github.com/natefinch/lumberjack"
)
var logger *log.Logger
func main() {
// 创建 lumberjack 轮转写入器
rotatingWriter := &lumberjack.Logger{
Filename: "./app.log", // 日志主文件路径(自动创建)
MaxSize: 10, // 单个日志文件最大尺寸(MB)
MaxBackups: 5, // 最多保留的旧日志文件数
MaxAge: 30, // 日志文件最长保留天数(0 表示不限)
Compress: true, // 是否启用 gzip 压缩归档(需 Go 1.16+)
}
// 将标准 log.Logger 输出重定向至 lumberjack
logger = log.New(rotatingWriter, "[INFO] ", log.Ldate|log.Ltime|log.Lshortfile)
// ✅ 此后所有 logger.Print/Printf/Println 调用均自动轮转
logger.Println("Application started.")
logger.Printf("User login attempt from %s", "192.168.1.100")
}? 关键说明:无需预先 os.OpenFile 创建文件——lumberjack.Logger 内部已完整处理文件打开、追加、切分与归档逻辑,并确保并发安全。上述示例中直接传入 &lumberjack.Logger{} 作为 log.SetOutput() 或 log.New() 的 io.Writer 即可。

通过 lumberjack,你只需三行核心代码即可为 Go 标准日志赋予企业级轮转能力:定义配置、实例化轮转写入器、绑定到 log.Logger。它无外部依赖、跨平台开箱即用、API 极简,是中小型 Go 项目日志基础设施的理想选择。上线前建议在目标系统(Windows/Linux)上验证轮转行为,并结合 systemd / Windows Services 配置日志目录持久化与磁盘空间监控。