在 CentOS 上,Golang 程序日志把磁盘写满是很常见的问题,通常不是 Go 语言本身“有 bug”,而是日志写入方式 + 系统环境共同作用的结果。下面按最常见原因给你梳理,并给出对应解决办法。
很多 Go 程序直接用:
log.SetOutput(os.Stdout)
或
f, _ := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
log.SetOutput(f)
问题:
/var 或 / 写满✅ 解决:
常见于:
现象:
✅ 解决:
journalctl -u your-service
确认是否一直在重启。
CentOS 7/8 使用 systemd-journald
如果你:
log.Println("xxx")
日志会进入:
/var/log/journal/
问题:
✅ 解决:
journalctl --disk-usage
清理:
journalctl --vacuum-size=500M
或限制大小:
# /etc/systemd/journald.conf
SystemMaxUse=500M
生产环境还开着:
log.Println("debug info")
高并发下:
✅ 解决:
info 或 warnCentOS 默认:
/var/log 可能在 / 分区✅ 解决:
df -h
确认哪个分区满了。
Go 只管写文件:
log.SetOutput(&lumberjack.Logger{
Filename: "/var/log/app.log",
MaxSize: 100,
MaxBackups: 5,
MaxAge: 7,
})
logrotate 示例:
/var/log/app.log {
daily
rotate 7
compress
missingok
notifempty
}
logger, _ := zap.NewProduction()
logger.Info("hello")
log.SetOutput(&lumberjack.Logger{
Filename: "/var/log/app.log",
})
# 看哪个目录占用大
du -sh /var/log/*
# 看磁盘
df -h
# 看 journal 占用
journalctl --disk-usage
# 看 systemd 服务是否频繁重启
systemctl status your-service
Go 日志占满 CentOS 盘,99% 是因为:日志只写不切 + 没有限制大小 + journald 或 /var 分区太小。
如果你愿意,可以把:
df -h 结果发出来,我可以直接帮你定位是哪一类问题。