在 Debian 上运行 Golang 程序时,“日志写满(磁盘/分区被日志占满)”是一个比较常见的问题。通常不是 Golang 本身“会自动写满日志”,而是配置或使用方式不当导致。下面按常见原因给你梳理一下。
Golang 标准库 log 不会自动切割日志。
如果你这样写:
log.SetOutput(os.OpenFile("/var/log/app.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644))
那么:
/var 或 / 写满✅ 解决:
logrotatelumberjack 等日志库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,
})
在 Debian + systemd 下:
[Service]
ExecStart=/opt/app/app
如果程序:
fmt.Printlnlog 输出到 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
常见场景:
✅ 排查:
tail -f /var/log/app.log
wc -l /var/log/app.log
✅ 解决:
sentry / zap 采样比如:
log.SetLevel(log.DebugLevel)
在生产环境会非常夸张。
✅ 建议:
infodebugDocker 默认 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
✅ 生产推荐:
zap / logruslumberjacklogrotate如果你愿意,可以贴一下:
我可以直接帮你给出具体配置方案。