在 CentOS 上运行 Golang 程序时,日志过大通常不是 Go 语言本身的问题,而是日志配置、运行方式或系统环境导致的。下面按常见原因给你系统梳理一下,并给出对应解决办法。
很多 Go 程序直接写文件:
log.SetOutput(os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644))
结果:日志一直追加,几个月后几个 GB 很正常。
✅ 解决:
logrotate(CentOS 自带)lumberjack)logrotate 示例
/var/log/myapp/*.log {
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
如果 Go 程序是:
systemctl start myapp
并且日志打到 stdout/stderr,CentOS 会存到:
/var/log/journal/
默认 不限制大小,很容易占满磁盘。
✅ 解决: 查看:
journalctl -u myapp
du -sh /var/log/journal
修改 systemd 配置:
[Service]
StandardOutput=append:/var/log/myapp/app.log
StandardError=append:/var/log/myapp/error.log
或限制 journal 大小:
# /etc/systemd/journald.conf
SystemMaxUse=500M
SystemKeepFree=1G
生产环境还开着:
log.Println("debug info")
请求量大时日志翻几倍。
✅ 解决:
zap / logrusinfo 或 warnlogger.SetLevel(logrus.InfoLevel)
例如:
✅ 解决:
Go 程序:
✅ 检查:
top
go tool pprof
如果用 Docker:
docker logs -f container
日志默认不切割,很容易几十 GB。
✅ 解决:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "5"
}
}
✅ 标准组合
/var/log/app)lumberjack 做切割logrotate 兜底示例:
import "gopkg.in/natefinch/lumberjack.v2"
log.SetOutput(&lumberjack.Logger{
Filename: "/var/log/app/app.log",
MaxSize: 100,
MaxBackups: 5,
MaxAge: 7,
Compress: true,
})
# 日志文件大小
du -sh /var/log/*
# journal 占用
journalctl --disk-usage
# 哪个进程在写
lsof | grep log
如果你愿意,可以把以下信息发我,我可以精准定位:
我可以直接帮你写 logrotate / systemd / Go 配置。