在 CentOS 上做 Golang 应用日志归档,通常有两种思路:
下面分别说明,并给出常见做法。
优点
/var/log/myapp/app.log
sudo vim /etc/logrotate.d/myapp
内容示例(按天归档,保留 7 天):
/var/log/myapp/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
copytruncate
}
| 参数 | 作用 |
|---|---|
| daily | 每天归档 |
| rotate 7 | 保留 7 份 |
| compress | 压缩旧日志 |
| copytruncate | 不重启 Go 程序直接截断日志(非常重要) |
| notifempty | 空日志不处理 |
⚠️ Go 程序必须一直写同一个日志文件,不要自己 rename 日志
sudo logrotate -f /etc/logrotate.d/myapp
如果你不想依赖系统工具,可以用 Go 库:
import (
"gopkg.in/natefinch/lumberjack.v2"
"log"
)
func main() {
log.SetOutput(&lumberjack.Logger{
Filename: "/var/log/myapp/app.log",
MaxSize: 100, // MB
MaxBackups: 7,
MaxAge: 7, // days
Compress: true,
})
log.Println("hello")
}
特点
os.Rename 日志文件copytruncate如果你是 systemd 启动:
systemctl status myapp
logrotate 不影响 systemd,只要 copytruncate 即可。
| 场景 | 建议 |
|---|---|
| 生产环境 | logrotate + copytruncate |
| 容器 / 简单程序 | lumberjack |
| 多服务统一 | logrotate |
如果你愿意,可以告诉我:
我可以给你精确到可直接用的配置。