在 CentOS 上“轮转(rotate)Golang 日志”通常不是由 Go 程序自己完成的,而是由 系统日志轮转工具(如 logrotate)来做。下面按常见场景给你讲清楚。
你的 Go 程序:
log.SetOutput(os.OpenFile("/var/log/myapp/app.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644))
新建文件:
sudo vi /etc/logrotate.d/myapp
示例配置:
/var/log/myapp/*.log {
daily
rotate 7
missingok
notifempty
compress
delaycompress
copytruncate
}
daily:每天轮转rotate 7:保留 7 份compress:压缩旧日志copytruncate:
sudo logrotate -f /etc/logrotate.d/myapp
查看结果:
ls -lh /var/log/myapp/
常用库:
github.com/lestrrat-go/file-rotatelogsgopkg.in/natefinch/lumberjack.v2import "gopkg.in/natefinch/lumberjack.v2"
log.SetOutput(&lumberjack.Logger{
Filename: "/var/log/myapp/app.log",
MaxSize: 10, // MB
MaxBackups: 7,
MaxAge: 7, // days
Compress: true,
})
✅ 优点:不依赖系统
❌ 缺点:CentOS 运维不统一
如果 Go 程序是 systemd 服务:
sudo systemctl edit myapp.service
[Service]
StandardOutput=append:/var/log/myapp/app.log
StandardError=append:/var/log/myapp/error.log
然后还是用 logrotate。
copytruncatecopytruncateos.Open 而不是 append✅ CentOS + Golang 最佳实践
Go 写日志文件 → logrotate 轮转 → copytruncate
如果你愿意,可以:
我可以直接帮你写完整配置。