“Debian 上 Golang 日志丢失”通常不是 Go 本身的问题,而是运行环境、输出方式或系统配置导致的。下面按常见原因逐一说明,并给出排查/解决建议。
在 Debian 上用 systemd 跑 Go 程序时:
现象
解决
# /etc/systemd/system/your.service
[Service]
StandardOutput=journal
StandardError=journal
查看日志:
journalctl -u your.service -f
或强制输出到文件:
StandardOutput=append:/var/log/your.log
StandardError=append:/var/log/your.log
如果你用了:
bufio.Writerlog.SetOutput(bufio.NewWriter(...))程序异常退出时,缓冲没写盘。
解决
log.Println 默认 logger(无缓冲)Flush()c := make(chan os.Signal, 1)
signal.Notify(c, syscall.SIGTERM)
<-c
logger.Sync() // zap
KillMode=process特点
排查
dmesg | grep -i kill
journalctl -u your.service | grep -i oom
如果你自己写文件:
os.OpenFile("app.log", O_CREATE|O_WRONLY|O_APPEND)
logrotate 后:
解决
logrotate + copytruncateSIGUSR1 重新打开日志/var/log 没写权限✅ 检查:
ls -l /var/log/your.log
os.Exit(0) 不跑 defer建议
defer func() {
if r := recover(); r != nil {
log.Println("panic:", r)
}
}()
✅ 生产环境推荐组合
zap / slogSync()如果你愿意,可以把:
发出来,我可以直接帮你定位是哪一类“丢日志”。