温馨提示×

为何centos golang日志过大

小樊
32
2026-09-30 06:32:22
栏目: 编程语言

在 CentOS 上运行 Go(Golang)程序时,日志过大通常不是 Go 语言本身的问题,而是运行环境、日志配置或系统机制导致的。下面按常见原因逐一说明,并给出解决思路。


一、最常见原因

1. 没有日志轮转(log rotation)

CentOS 默认不会自动帮你“切分”应用日志。

常见问题:

  • 日志直接写到文件(如 app.log)
  • 程序 7×24 运行
  • 从不删除或切割

结果:

app.log  → 10GB / 50GB / 甚至占满磁盘

✅ 解决:

  • 用 logrotate
  • 或 Go 程序内使用日志库自动切割(如 lumberjack)

2. Go 程序日志级别太低(Debug / Info 全开)

很多项目默认:

log.SetLevel(log.DebugLevel)

在 CentOS 生产环境会疯狂打日志:

  • HTTP 请求
  • SQL
  • 第三方调用
  • 堆栈

✅ 解决:

log.SetLevel(log.InfoLevel) // 或 Warn

3. 标准库 log 不会自动切割

Go 标准库:

log.Println(...)

没有:

  • 文件大小限制
  • 时间切割
  • 压缩

✅ 推荐替代:

  • zap + lumberjack
  • logrus + rotatelogs

4. panic / 错误循环打印

典型场景:

  • 网络断开
  • 重试逻辑没限制
  • 每毫秒打印一次错误
connection refused
connection refused
connection refused
...

✅ 解决:

  • 限制重试次数
  • 错误采样
  • 指数退避

5. systemd 的 journal 日志膨胀(容易忽视)

CentOS 7/8 使用 systemd:

journalctl -u your-service

如果 Go 程序输出到 stdout/stderr:

  • 日志会进入 journal
  • journal 默认可能很大

查看大小:

journalctl --disk-usage

✅ 解决:

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

然后:

systemctl restart systemd-journald

6. 标准输出被重定向到文件且无限制

常见错误写法:

nohup ./app > app.log 2>&1 &

✅ 改进:

./app >> app.log 2>&1

配合 logrotate


二、推荐的生产级日志方案(CentOS + Go)

方案 1:Go 内切割(最省心)

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

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

方案 2:logrotate(系统级)

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

三、快速排查命令

# 查看大文件
du -sh /var/log/*

# 看 journal 占用
journalctl --disk-usage

# 看某个进程日志
lsof | grep log

总结一句话

CentOS 上 Go 日志过大,99% 是因为“没有日志轮转 + 日志级别太低”

如果你愿意,可以贴:

  • 日志怎么写的(代码)
  • 运行方式(systemd / nohup)
  • 日志路径

我可以帮你给出针对性优化方案。

0 踩