温馨提示×

debian golang日志为何满

小樊
36
2026-10-04 04:48:19
栏目: 编程语言

在 Debian 上运行 Golang 程序时,“日志写满(磁盘/分区被日志占满)”是一个比较常见的问题。通常不是 Golang 本身“会自动写满日志”,而是配置或使用方式不当导致。下面按常见原因给你梳理一下。


一、最常见原因

1. 日志没有轮转(log rotate 缺失)

Golang 标准库 log 不会自动切割日志。

如果你这样写:

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

那么:

  • 程序运行越久,文件越大
  • 最终把 /var 或 / 写满

✅ 解决:

  • 用 logrotate
  • 或用 lumberjack 等日志库
import "gopkg.in/natefinch/lumberjack.v2"

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

2. 标准输出 / 错误输出被 systemd 接管

在 Debian + systemd 下:

[Service]
ExecStart=/opt/app/app

如果程序:

  • 直接 fmt.Println
  • 或 log 输出到 stdout

日志会进入:

/var/log/journal/

journal 默认可能:

  • 不限制大小
  • 或限制很大

✅ 检查:

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

✅ 解决:

[Service]
StandardOutput=append:/var/log/app.out.log
StandardError=append:/var/log/app.err.log

并配合 logrotate


3. 程序异常疯狂打日志(死循环 / panic 重试)

常见场景:

  • HTTP 请求失败不停重试
  • goroutine 泄漏
  • 每秒几千条 error 日志

✅ 排查:

tail -f /var/log/app.log
wc -l /var/log/app.log

✅ 解决:

  • 加日志级别
  • 限制错误日志频率
  • 用 sentry / zap 采样

4. 日志级别设置过低

比如:

log.SetLevel(log.DebugLevel)

在生产环境会非常夸张。

✅ 建议:

  • 生产用 info
  • 调试才用 debug

5. Docker / Kubernetes 场景(如果你在容器里)

Docker 默认 json-file 日志:

  • 不限制大小
  • 直接写满宿主机

✅ 解决:

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

二、快速排查命令

# 看哪个目录最大
du -h /var/log | sort -h

# 看具体文件
ls -lh /var/log

# 看 journal 占用
journalctl --disk-usage

# 看进程打开的日志文件
lsof | grep log

三、推荐组合(Debian + Go)

✅ 生产推荐:

  • zap / logrus
  • lumberjack
  • logrotate
  • systemd 限制日志大小

如果你愿意,可以贴一下:

  • 你是怎么启动 Go 程序的(systemd?docker?直接跑?)
  • 日志写到哪里
  • 用的什么日志库

我可以直接帮你给出具体配置方案。

0 踩