CentOS 中 Golang 日志清理策略
策略总览
方案一 使用 logrotate 统一管理
/var/log/myapp.log {
daily
rotate 7
compress
missingok
notifempty
create 0640 root root
}
sudo logrotate -d /etc/logrotate.d/golang-appsudo logrotate -f /etc/logrotate.d/golang-app/var/log/myapp.log {
size 100M
rotate 30
compress
delaycompress
missingok
notifempty
create 0640 root adm
sharedscripts
postrotate
/usr/bin/systemctl reload myapp.service >/dev/null 2>&1 || true
endscript
}
方案二 在应用内使用 lumberjack 轮转
go get gopkg.in/natefinch/lumberjack.v2package main
import (
"github.com/sirupsen/logrus"
"gopkg.in/natefinch/lumberjack.v2"
)
func main() {
logger := logrus.New()
logger.SetFormatter(&logrus.JSONFormatter{})
logger.SetOutput(&lumberjack.Logger{
Filename: "/var/log/myapp.log", // 日志路径
MaxSize: 10, // 单个文件最大 10MB
MaxBackups: 7, // 最多保留 7 个备份
MaxAge: 30, // 备份最长保留 30 天
Compress: true, // 启用压缩
})
logger.Info("hello, world")
}
策略对比与选择建议
对比要点:
| 维度 | logrotate | lumberjack |
|---|---|---|
| 管理方式 | 系统级、集中配置 | 应用内、随二进制 |
| 触发条件 | 按时间/按大小(size) | 按大小/按时间/按保留数量 |
| 清理依据 | 保留份数(rotate)、按天/按大小策略 | MaxBackups、MaxAge |
| 运维成本 | 低(统一策略),需了解配置 | 低(代码即策略),需重新部署 |
| 典型场景 | 多服务统一治理、对接 syslog/journal | 容器/短生命周期任务、简化部署 |
选择建议:
实施要点与运维建议
logrotate -d/-f 验证,定期抽检压缩与清理是否生效。