贝利信息

如何在 Go 中实现带日志轮转(Log Rotation)的文件日志记录

日期:2026-01-24 00:00 / 作者:碧海醫心

本文介绍使用 lumberjack 库为 go 标准 log 包添加跨平台日志轮转能力,满足生产环境对自动切分、备份、过期清理等需求,同时兼容 linux 与 windows 系统。

在构建长期运行的 Go Web 应用(如部署于远程服务器的 API 服务或后台任务)时,可靠的日志记录是调试、监控与审计的关键。Go 标准库的 log 包简单易用,但原生不支持日志轮转(log rotation)——即按大小、时间或数量自动切分、归档与清理旧日志。若手动实现轮转逻辑,不仅易出错,还难以兼顾跨平台一致性(如 Windows 与 Linux 的文件锁、路径分隔符、权限模型差异)。

此时,lumberjack 是业界广泛采用的轻量级、零依赖、纯 Go 实现的日志轮转封装器。它专为无缝集成 log.Logger 而设计,完全兼容标准库,无需修改已有日志调用代码,且天然支持 Windows 和类 Unix 系统。

✅ 快速集成步骤

  1. 安装 lumberjack(推荐使用 Go Modules):

    go get github.com/natefinch/lumberjack
  2. 导入并配置 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 配置日志目录持久化与磁盘空间监控。