在 Debian(以及绝大多数 Linux 发行版)上,Go 程序“日志丢失”通常不是 Go 本身的问题,而是运行环境、标准输出/错误行为、系统日志机制或权限导致的。下面按常见原因系统性说明,并给出排查与解决办法。
log.Print / fmt.PrintlnGo 默认日志输出到 stderr / stdout。
./app & 运行./app &
# 关闭终端 -> 日志丢失
✅ 解决
nohup ./app > app.log 2>&1 &
或
./app >> app.log 2>&1 &
Go 程序通过 systemd 启动时,日志在 journal 里,不在文件里。
journalctl -u your-service -f
/var/log✅ 解决(二选一):
A. 看 journal
journalctl -u yourapp.service
B. 强制写文件
[Service]
StandardOutput=append:/var/log/yourapp.log
StandardError=append:/var/log/yourapp.log
例如:
logruszap(异步)✅ 解决
signal.Notify(ch, syscall.SIGTERM, syscall.SIGINT)
Logger.Sync()logFile, _ := os.OpenFile("/var/log/app.log", ...)
如果:
→ 日志静默丢失
✅ 排查
ls -ld /var/log
touch /var/log/test && echo OK
✅ 解决
/home/user/logs✅ 解决
* * * * * /opt/app >> /var/log/app.log 2>&1
Debian 默认 UTC
Go 日志可能显示 UTC,误以为“没发生”
timedatectl
# 1. 是否在 systemd
systemctl status yourapp
# 2. 查 journal
journalctl -u yourapp -f
# 3. 是否重定向
ps aux | grep yourapp
# 4. 日志文件权限
ls -l /var/log/yourapp.log
# 5. Go 是否 flush
grep Sync main.go
log.SetOutput(os.Stdout)
如果你愿意,可以贴:
我可以帮你精准定位。