在 CentOS 上“轮转(rotate)Golang 日志”通常有 两种思路:
下面分别说明。
让 Go 程序把日志写到固定文件,例如:
log.SetOutput(os.OpenFile("/var/log/myapp/app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644))
⚠️ 不要自己切文件,交给 logrotate。
新建配置文件:
sudo vi /etc/logrotate.d/myapp
示例内容:
/var/log/myapp/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
copytruncate
}
daily:每天轮转rotate 14:保留 14 份compress:压缩旧日志copytruncate:关键,不重启 Go 程序也能继续写notifempty:空文件不轮转sudo logrotate -d /etc/logrotate.d/myapp # 调试
sudo logrotate -f /etc/logrotate.d/myapp # 强制执行
适合 容器 / 无 logrotate 环境
import "github.com/lestrrat-go/file-rotatelogs"
rl, _ := rotatelogs.New(
"/var/log/myapp/app.%Y%m%d.log",
rotatelogs.WithMaxAge(14*24*time.Hour),
rotatelogs.WithRotationTime(24*time.Hour),
)
log.SetOutput(rl)
✅ 优点:
❌ 缺点:
| 场景 | 推荐方式 |
|---|---|
| CentOS 服务器 | ✅ logrotate + copytruncate |
| Docker / K8s | Go 内部轮转 或 不轮转(交给采集) |
| 简单脚本 | logrotate |
如果你愿意,我可以:
直接说你的使用场景即可。