温馨提示×

为何debian golang日志满

小樊
42
2026-09-01 05:38:13
栏目: 编程语言

在 Debian 上使用 Go(Golang)时,“日志满”通常不是 Go 本身的问题,而是运行环境、部署方式或日志配置导致的。下面按常见原因系统地说明,并给出排查和解决建议。


一、最常见原因

1. systemd 日志(journald)占满磁盘

如果你用 systemd 运行 Go 服务:

sudo journalctl -u your-go-service

journald 默认会一直存日志,可能占满 /var/log/journal

检查:

du -sh /var/log/journal

解决:

sudo journalctl --vacuum-size=100M

限制 journald:

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

2. Go 程序自己写日志到文件,没有轮转

很多 Go 程序直接用:

log.Println(...)

或:

os.OpenFile("/var/log/app.log", ...)

但没有日志切割(log rotation)。

结果:

  • 单文件越来越大
  • 最终磁盘 100%

解决:

  • 使用 logrotate
  • 或使用 Go 日志库(如 lumberjack

logrotate 示例:

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

3. 程序异常循环打印日志

典型问题:

for {
    log.Println("error")
}

或:

  • 网络断开不断重试
  • 数据库连不上疯狂报错

表现:

  • 几分钟内日志爆掉
  • CPU 也高

解决:

  • 加日志级别
  • 加限流 / 退避重试
  • 只在必要时记录

4. stdout / stderr 被 systemd 捕获

即使你“没写文件”,systemd 也会把:

fmt.Println("...")

捕获进 journal。

解决:

  • 明确关闭不必要的输出
  • 或 redirect 到 /dev/null(不推荐长期)

5. Docker / 容器日志满

如果是容器跑 Go:

docker logs container_id

Docker 默认 json-file 日志不限制。

解决:

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

二、排查步骤(实用)

1. 看磁盘

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

2. 看是谁在写

lsof | grep log

3. 看 journal

journalctl --disk-usage

4. 看 Go 进程

ps aux | grep your-go-app

三、推荐做法(最佳实践)

✅ 使用日志库:

  • log/slog(Go 1.21+)
  • zap
  • logrus

✅ 配合:

  • lumberjack
  • logrotate

✅ systemd 服务中:

StandardOutput=journal
StandardError=journal

四、如果你愿意

你可以贴出:

  • Go 是怎么运行的(systemd / docker / 直接跑)
  • 日志写在哪
  • 报错或现象截图

我可以帮你精准定位是哪一种“满”

0