在 Debian 上让 Golang 日志轮转,常见做法有下面几种,按“推荐程度”给你说明。
logrotate(不改动 Go 代码)原则:Go 程序只负责往文件写日志,logrotate 负责切割和清理。
logFile, _ := os.OpenFile("/var/log/myapp/app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
log.SetOutput(logFile)
不要自己处理轮转
which logrotate
sudo vim /etc/logrotate.d/myapp
内容示例:
/var/log/myapp/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
copytruncate
}
| 参数 | 作用 |
|---|---|
daily |
每天轮转 |
rotate 14 |
保留 14 份 |
compress |
压缩旧日志 |
copytruncate |
不重启程序即可轮转(Go 最常用) |
✅
copytruncate对 Go 程序非常重要
sudo logrotate -f /etc/logrotate.d/myapp
适合:
gopkg.in/natefinch/lumberjack.v2(最常用)import "gopkg.in/natefinch/lumberjack.v2"
log.SetOutput(&lumberjack.Logger{
Filename: "/var/log/myapp/app.log",
MaxSize: 10, // MB
MaxBackups: 5,
MaxAge: 28, // days
Compress: true,
})
✅ 优点:跨平台
❌ 缺点:压缩/策略不如 logrotate 灵活
如果你用 systemd 启动 Go 程序:
[Service]
ExecStart=/usr/local/bin/myapp
StandardOutput=append:/var/log/myapp/app.log
再配合 logrotate + copytruncate
| 场景 | 方案 |
|---|---|
| 普通 Debian 服务 | ✅ logrotate + copytruncate |
| 容器 | Go + lumberjack / stdout |
| 高可控 | systemd + logrotate |
如果你愿意,可以告诉我:
我可以直接帮你写一份 可用配置。