在 CentOS 上,Go 语言日志的“切割”通常不推荐在 Go 程序里手写,而是用 系统级日志轮转工具 或 Go 日志库自带切割能力。下面按常见方案给你讲清楚。
log.Println 到文件)zerolog / zap / logrus 写文件假设日志文件:
/var/log/myapp/app.log
sudo vim /etc/logrotate.d/myapp
内容示例:
/var/log/myapp/*.log {
daily
rotate 7
missingok
notifempty
compress
delaycompress
copytruncate
}
| 参数 | 作用 |
|---|---|
| daily | 每天切割 |
| rotate 7 | 保留 7 份 |
| compress | 压缩旧日志 |
| copytruncate | 不重启程序就切割(Go 常用) |
sudo logrotate -f /etc/logrotate.d/myapp
✅ 这是 CentOS 上最稳定、最推荐的方式
lumberjack(最常用)import "gopkg.in/natefinch/lumberjack.v2"
log.SetOutput(&lumberjack.Logger{
Filename: "/var/log/myapp/app.log",
MaxSize: 100, // MB
MaxBackups: 7,
MaxAge: 7, // days
Compress: true,
})
✅ 优点
❌ 缺点
writer := zapcore.AddSync(&lumberjack.Logger{
Filename: "/var/log/myapp/app.log",
MaxSize: 100,
MaxBackups: 7,
MaxAge: 7,
})
如果你用:
journalctl -u myapp
那日志由 systemd 管理,不需要切割文件。
会导致:
✅ 二选一
| 场景 | 推荐 |
|---|---|
| CentOS 服务 | logrotate |
| 容器 / 跨平台 | lumberjack |
| 简单脚本 | logrotate |
| 高并发服务 | zap + lumberjack |
如果你愿意,可以告诉我:
我可以直接给你一份可复制的配置。