在 Debian 上运行 Go 程序时“日志丢失”并不是 Go 本身的 bug,而是运行环境、输出方式、进程管理等外部因素导致。下面按最常见原因给你系统梳理一下。
log / fmt.Println 是行缓冲还是全缓冲?✅ 解决:
log.SetOutput(os.Stderr)(stderr 一般无缓冲)os.Stdout.Sync()log 包而不是 fmt.Printlngo run main.go 有日志systemd 启动:日志不见✅ 正确查看方式:
journalctl -u your-service -f
✅ service 文件建议:
[Service]
StandardOutput=journal
StandardError=journal
这些情况:
✅ 建议:
defer func() {
if r := recover(); r != nil {
log.Println("panic:", r)
}
}()
/var/log 需要 root✅ 检查:
ls -l your.log
sudo touch /var/log/test.log
✅ 推荐:
/var/log/<app>/nohup ./app &
默认:
nohup.out✅ 明确指定:
./app >> /var/log/app.log 2>&1 &
✅ 正确:
log.SetOutput(os.Stdout)
✅ 检查:
ls -lh /var/log/
你可以逐一确认:
log 而不是 fmtjournalctllog.SetOutput(os.Stderr)
log.SetFlags(log.LstdFlags | log.Lshortfile)
配合 systemd:
StandardOutput=journal
StandardError=journal
如果你愿意,可以贴:
我可以直接帮你定位是哪一种“丢失”。