在 CentOS 上,Golang 程序本身的日志轮转(log rotation)一般不靠 Go 代码自己实现,而是由系统工具来完成。常见方案如下:
CentOS 自带 logrotate,非常适合 Go 程序。
/var/log/myapp/app.log
sudo vi /etc/logrotate.d/myapp
内容示例:
/var/log/myapp/*.log {
daily
rotate 7
missingok
notifempty
compress
delaycompress
copytruncate
dateext
}
daily:每天轮转rotate 7:保留 7 份compress:压缩旧日志copytruncate:不重启程序,直接截断原日志(Go 程序常用)dateext:日志带日期⚠️ 如果 Go 程序用文件句柄写日志,
copytruncate是最安全的
sudo logrotate -d /etc/logrotate.d/myapp # 测试(不真正执行)
sudo logrotate -f /etc/logrotate.d/myapp # 强制执行
如果你的 Go 程序是用 systemd 启动的:
[Unit]
Description=My Go App
[Service]
ExecStart=/opt/myapp/myapp
Restart=always
StandardOutput=append:/var/log/myapp/app.log
StandardError=append:/var/log/myapp/error.log
[Install]
WantedBy=multi-user.target
/var/log/myapp/*.log {
daily
rotate 14
compress
copytruncate
}
如果你不想依赖系统工具,可以用 Go 库:
gopkg.in/natefinch/lumberjack.v2示例:
import "gopkg.in/natefinch/lumberjack.v2"
log.SetOutput(&lumberjack.Logger{
Filename: "/var/log/myapp/app.log",
MaxSize: 100, // MB
MaxBackups: 7,
MaxAge: 30, // days
Compress: true,
})
✅ 优点:跨平台
❌ 缺点:日志名不带日期、功能有限
| 方案 | 是否推荐 | 说明 |
|---|---|---|
| logrotate | ✅✅✅ | CentOS 标准做法 |
| systemd + logrotate | ✅✅✅ | 生产最稳 |
| Go 内部轮转 | ⚠️ | 小工具可用 |
| 自己写轮转 | ❌ | 没必要 |
✅ CentOS + Golang 最佳实践
如果你愿意,可以告诉我:
我可以给你一份完全可直接用的配置。