Linux下Golang日志管理实践
一 管理思路与总体建议
二 常用方案对比与适用场景
| 方案 | 核心机制 | 优点 | 局限 | 典型场景 |
|---|---|---|---|---|
| logrotate | 系统级按时间/大小轮转、压缩、清理 | 统一管理、无需改代码、与系统生态兼容 | 依赖外部配置与定时任务,需验证有效性 | 物理机/虚拟机部署、多服务统一治理 |
| lumberjack | 应用内按文件大小轮转、压缩、保留天数 | 内嵌程序、部署简单、参数可控 | 增加少量运行时开销,需引入依赖 | 容器、云原生、希望与应用生命周期一致 |
| journald + systemd | 由 systemd 接管 stdout/stderr,集中日志 | 集中管理、便于检索与转发 | 二进制日志,需熟悉 journalctl | 以 systemd 管理的服务、容器化微服务 |
| 第三方库内置轮转 | 如 file-rotatelogs 等 | 灵活可配置、可按时间轮转 | 生态与维护成本需评估 | 需要按天命名、软链当前日志等需求 |
三 落地配置示例
/path/to/your/golang/app/logs/*.log {
daily
rotate 7
compress
missingok
notifempty
create 0640 root root
}
logrotate -d /etc/logrotate.d/myapp # 干跑校验
logrotate -f /etc/logrotate.d/myapp # 强制执行一次
说明:按天轮转、保留7份、压缩旧日志、空文件不轮转、自动创建新文件并设置权限。import (
"log"
"github.com/natefinch/lumberjack"
)
log.SetOutput(&lumberjack.Logger{
Filename: "/path/to/your/golang/app/logs/myapp.log",
MaxSize: 10, // MB
MaxBackups: 7, // 保留个数
MaxAge: 30, // 保留天数
Compress: true, // 压缩
})
import (
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"gopkg.in/natefinch/lumberjack.v2"
)
w := zapcore.AddSync(&lumberjack.Logger{
Filename: "app.log",
MaxSize: 5, // MB
MaxBackups: 3,
MaxAge: 28, // days
})
cfg := zap.NewProductionConfig()
cfg.OutputPaths = []string{"stdout", "app.log"}
logger, _ := cfg.Build(zapcore.AddSync(w))
defer logger.Sync()
logger.Info("hello")
提示:lumberjack 的MaxSize/MaxBackups/MaxAge/Compress可按磁盘与合规要求调整。sudo journalctl -u myapp.service -n 100sudo journalctl --vacuum-time=2weeks四 监控 清理与最佳实践
rm -rf 直接删除正在写入的日志;优先通过轮转与过期清理机制处理。