温馨提示×

golang日志为何占满centos盘

小樊
40
2026-10-03 03:57:27
栏目: 编程语言

在 CentOS 上,Golang 程序日志把磁盘写满是很常见的问题,通常不是 Go 语言本身“有 bug”,而是日志写入方式 + 系统环境共同作用的结果。下面按最常见原因给你梳理,并给出对应解决办法。


一、最常见原因

1️⃣ 日志没有滚动(无 log rotate)

很多 Go 程序直接用:

log.SetOutput(os.Stdout)

或

f, _ := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
log.SetOutput(f)

问题:

  • 日志一直追加
  • 没有按大小 / 时间切分
  • 最终把 /var 或 / 写满

✅ 解决:

  • 使用 logrotate
  • 或使用 Go 日志库(见下文)

2️⃣ 程序 crash / panic 无限重启写日志

常见于:

  • systemd 服务
  • k8s Pod 重启

现象:

  • 程序一启动就 panic
  • systemd 不断重启
  • 每次都写大量 stack trace

✅ 解决:

journalctl -u your-service

确认是否一直在重启。


3️⃣ 日志输出到 stdout,被 journald 存盘

CentOS 7/8 使用 systemd-journald

如果你:

log.Println("xxx")

日志会进入:

/var/log/journal/

问题:

  • journald 默认不自动清理
  • 磁盘慢慢被占满

✅ 解决:

journalctl --disk-usage

清理:

journalctl --vacuum-size=500M

或限制大小:

# /etc/systemd/journald.conf
SystemMaxUse=500M

4️⃣ 日志级别过低(Debug / Trace)

生产环境还开着:

log.Println("debug info")

高并发下:

  • 每秒几 MB
  • 几天就满盘

✅ 解决:

  • 使用 zap / logrus
  • 生产环境用 info 或 warn

5️⃣ 磁盘本身分区小(/var 或 / 很小)

CentOS 默认:

  • /var/log 可能在 / 分区
  • 云服务器经常只有 20–40G

✅ 解决:

df -h

确认哪个分区满了。


二、Go 中正确的日志做法(推荐)

✅ 方案 1:使用 logrotate(最简单)

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
}

✅ 方案 2:使用成熟日志库(强烈推荐)

zap(Uber,高性能)

logger, _ := zap.NewProduction()
logger.Info("hello")

logrus

log.SetOutput(&lumberjack.Logger{
    Filename: "/var/log/app.log",
})

三、快速排查命令(CentOS)

# 看哪个目录占用大
du -sh /var/log/*

# 看磁盘
df -h

# 看 journal 占用
journalctl --disk-usage

# 看 systemd 服务是否频繁重启
systemctl status your-service

四、总结一句话

Go 日志占满 CentOS 盘,99% 是因为:日志只写不切 + 没有限制大小 + journald 或 /var 分区太小。

如果你愿意,可以把:

  • 你的日志代码
  • 启动方式(systemd / docker / 裸跑)
  • df -h 结果

发出来,我可以直接帮你定位是哪一类问题。

0 踩