温馨提示×

centos golang日志为何过大

小樊
51
2026-10-11 23:21:16
栏目: 编程语言

在 CentOS 上运行 Golang 程序时,日志过大通常不是 Go 语言本身的问题,而是日志配置、运行方式或系统环境导致的。下面按常见原因给你系统梳理一下,并给出对应解决办法。


一、最常见原因

1️⃣ 没有做日志切割(rotation)

很多 Go 程序直接写文件:

log.SetOutput(os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644))

结果:日志一直追加,几个月后几个 GB 很正常。

✅ 解决:

  • 使用 logrotate(CentOS 自带)
  • 或用 Go 日志库自带切割(如 lumberjack)

logrotate 示例

/var/log/myapp/*.log {
    daily
    rotate 7
    compress
    missingok
    notifempty
    copytruncate
}

2️⃣ 使用 systemd 运行,stdout 日志爆炸

如果 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

3️⃣ 日志级别太低(Debug / Trace)

生产环境还开着:

log.Println("debug info")

请求量大时日志翻几倍。

✅ 解决:

  • 使用 zap / logrus
  • 生产环境用 info 或 warn
logger.SetLevel(logrus.InfoLevel)

4️⃣ 请求量大 + 全量日志

例如:

  • 每个 HTTP 请求都打印 header
  • SQL 全量打印
  • 中间件全量日志

✅ 解决:

  • 只记录关键路径
  • 错误才打 stack
  • 用采样日志(如 zap sampling)

5️⃣ panic / 死循环疯狂打印

Go 程序:

  • goroutine 泄漏
  • 死循环 + log

✅ 检查:

top
go tool pprof

6️⃣ Docker + CentOS

如果用 Docker:

docker logs -f container

日志默认不切割,很容易几十 GB。

✅ 解决:

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

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

✅ 标准组合

  • 日志写文件(/var/log/app)
  • lumberjack 做切割
  • logrotate 兜底
  • 不依赖 journald

示例:

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

如果你愿意,可以把以下信息发我,我可以精准定位:

  1. Go 用的日志库
  2. 是否 systemd / docker
  3. 日志路径
  4. 单日增长大概多少 MB/GB

我可以直接帮你写 logrotate / systemd / Go 配置。

0 踩