温馨提示×

centos golang日志为何满

小樊
43
2026-10-06 01:38:33
栏目: 编程语言

在 CentOS 上运行 Golang 程序时,“日志写满(磁盘满 / 日志爆满)”是很常见的问题,通常不是 Golang 本身的 bug,而是日志配置或使用方式不当导致的。下面按「常见原因 → 排查方法 → 解决建议」给你系统说明。


一、常见原因(90% 都在这里)

1️⃣ 日志没有轮转(最常见)

很多 Golang 程序直接用:

log.Println(...)
fmt.Println(...)

输出到 stdout 或文件,但没有 log rotate。

在 CentOS 上常见场景:

  • 用 nohup ./app > app.log &
  • systemd 服务日志直接写文件
  • 容器里漏配 log driver

结果:

  • 一天几 GB
  • 几个月后磁盘 100%

✅ 典型现象:

df -h
/dev/sda1  100%  /var

2️⃣ 日志级别设置过低(Debug / Trace)

生产环境还开着:

log.SetLevel(log.DebugLevel)

结果:

  • 请求参数
  • SQL
  • 调用栈 全部写盘

✅ 检查:

grep -R "DebugLevel\|logger.Debug" .

3️⃣ 异常循环疯狂打日志

典型代码问题:

for {
    log.Println("error")
}

或:

defer func() {
    if err != nil {
        log.Println(err)
    }
}()

在 panic recover 场景里反复触发。

✅ 特征:

  • 单文件几分钟内暴涨
  • CPU 也高

4️⃣ systemd journal 日志爆满

CentOS 7/8 使用 journald:

  • 程序 stdout / stderr
  • 没限制 journal 大小

查看:

journalctl -u your-service
du -sh /var/log/journal

5️⃣ Docker / Kubernetes 日志未限制

如果你是容器运行:

  • 没配 log-opt max-size
  • 一个 Pod 打几 GB
docker inspect <container> | grep Log

6️⃣ 多协程并发写同一文件(锁 + 堆积)

  • 没用 zap / logrus
  • 自己写文件
  • 并发高时缓冲堆积

二、快速排查(一步一步来)

1️⃣ 找出是谁占满磁盘

df -h
du -sh /var/log/*

2️⃣ 找大日志文件

find / -type f -size +100M 2>/dev/null

3️⃣ 看实时日志增长速度

watch -n 1 'ls -lh app.log'

4️⃣ 看是什么在写

lsof | grep deleted
iotop

三、正确解决方案(强烈建议)

✅ 1. 使用专业日志库(不要手写)

推荐:

  • zap(Uber,性能最好)
  • logrus
  • slog(Go 1.21+)

示例(zap):

logger, _ := zap.NewProduction()
defer logger.Sync()
logger.Info("start")

✅ 2. 日志轮转(必须)

使用 lumberjack

import "gopkg.in/natefinch/lumberjack.v2"

log.SetOutput(&lumberjack.Logger{
    Filename:   "/var/log/app.log",
    MaxSize:    100,
    MaxBackups: 5,
    MaxAge:     7,
    Compress:   true,
})

✅ 3. CentOS 配置 logrotate

/etc/logrotate.d/app
/var/log/app.log {
    daily
    rotate 7
    compress
    missingok
    notifempty
    copytruncate
}

测试:

logrotate -d /etc/logrotate.d/app

✅ 4. systemd 限制 journal

[Service]
StandardOutput=journal
journalctl --vacuum-size=500M

✅ 5. Docker 限制日志

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "5"
  }
}

四、生产环境最佳实践(总结)

✅ 不写 stdout 到文件
✅ 用 zap + lumberjack
✅ 生产只开 info/warn
✅ 容器必须限日志
✅ 定期 logrotate


如果你愿意,可以把:

  • Golang 日志代码片段
  • 运行方式(systemd / docker / nohup)
  • df -h 结果

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

0 踩