温馨提示×

Debian Golang日志为何过大

小樊
36
2026-08-11 21:27:50
栏目: 编程语言

在 Debian 上运行 Golang 程序时,日志过大通常不是单一原因,常见原因和对应解决办法如下(按出现频率排序):


一、最常见原因

1. 程序没有做日志轮转(Log Rotation)

很多 Go 程序直接写文件,没有按大小或时间切分日志。

现象

  • /var/log/xxx.log 越来越大
  • 磁盘被写满

解决 ✅ 使用 logrotate(推荐)

sudo apt install logrotate

示例 /etc/logrotate.d/myapp

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

copytruncate 对 Go 程序很友好,不需要重启进程


2. Go 程序本身没有限制日志级别

很多程序默认打 DEBUG / INFO 日志。

常见代码问题

log.SetFlags(log.LstdFlags | log.Lshortfile)
log.Println("debug info")

解决

  • 使用日志级别控制
  • 生产环境关闭 debug

✅ 推荐库:

  • log/slog(Go 1.21+,官方)
  • zap
  • logrus

示例(slog):

logger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{
    Level: slog.LevelWarn,
}))

3. 标准库 log 没有自动切分

log不会轮转、不会限制大小

错误示例

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

解决

  • 把日志输出到 stdout
  • 由 systemd / Docker / logrotate 管理

4. systemd 日志(journal)过大

如果是 systemd 服务,日志可能在:

/var/log/journal/

查看大小

journalctl --disk-usage

限制大小

sudo nano /etc/systemd/journald.conf
SystemMaxUse=200M

然后:

sudo systemctl restart systemd-journald

5. 程序 panic / 高频错误导致刷日志

例如:

  • 请求失败就打日志
  • goroutine 中死循环打日志

现象

  • 日志增长速度极快
  • 相同错误重复出现

解决

  • 错误采样
  • 只打一次
  • 使用 rate limiter

6. Docker / Kubernetes 场景

如果是容器运行:

docker logs <container> 无限增长

解决

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

二、推荐的最佳实践(Debian + Go)

程序只输出到 stdout/stderr
由 systemd / Docker / logrotate 处理日志
生产环境使用结构化和级别日志


三、快速排查清单

你可以按这个顺序检查:

  1. 日志文件在哪?
    lsof -p <pid> | grep log
    
  2. 是否使用 logrotate?
  3. 是否直接写文件而不是 stdout?
  4. 日志级别是否过高?
  5. 是否是 journal 日志?

四、如果你愿意,我可以帮你具体分析

你可以贴出:

  • 程序日志相关代码
  • 是否使用 systemd
  • 日志路径
  • 是否 Docker

我可以直接给你针对性的修改方案

0