在 Debian 上运行 Golang 程序时,日志过大通常不是单一原因,常见原因和对应解决办法如下(按出现频率排序):
很多 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 程序很友好,不需要重启进程
很多程序默认打 DEBUG / INFO 日志。
常见代码问题
log.SetFlags(log.LstdFlags | log.Lshortfile)
log.Println("debug info")
解决
✅ 推荐库:
log/slog(Go 1.21+,官方)zaplogrus示例(slog):
logger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{
Level: slog.LevelWarn,
}))
log 没有自动切分log 包不会轮转、不会限制大小。
错误示例
f, _ := os.OpenFile("/var/log/app.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
log.SetOutput(f)
解决
如果是 systemd 服务,日志可能在:
/var/log/journal/
查看大小
journalctl --disk-usage
限制大小
sudo nano /etc/systemd/journald.conf
SystemMaxUse=200M
然后:
sudo systemctl restart systemd-journald
例如:
现象
解决
如果是容器运行:
docker logs <container> 无限增长
解决
{
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
✅ 程序只输出到 stdout/stderr
✅ 由 systemd / Docker / logrotate 处理日志
✅ 生产环境使用结构化和级别日志
你可以按这个顺序检查:
lsof -p <pid> | grep log
你可以贴出:
我可以直接给你针对性的修改方案。