在 Debian 上使用 Golang 时日志为空,通常不是 Go 本身的问题,而是运行环境、系统日志配置或输出方式导致的。下面按常见原因给你一个排查清单。
log 但没触发log.Println("hello")
如果程序提前退出或没执行到这一行,日志自然为空。
✅ 排查:
go run main.go
确认程序确实运行到日志位置。
如果你在 Debian 上用 systemd 管理服务,日志不在文件里,而是:
stdout / stderr → journald
[Service]
ExecStart=/usr/local/bin/myapp
✅ 正确查看日志:
journalctl -u myapp.service
❌ 错误做法:
/var/log/myapp.log 找log.Println 会写文件Go 的 stdout 在不是终端时会被缓冲,程序异常退出时日志还没刷出来。
fmt.Println("start")
os.Exit(0)
✅ 解决方式之一:
log.SetOutput(os.Stdout)
log.Println("start")
或者:
fmt.Println("start")
os.Stdout.Sync()
os.Exit(0)
StandardOutput=null
StandardError=null
✅ 改为:
StandardOutput=journal
StandardError=journal
然后:
systemctl daemon-reexec
systemctl restart myapp
docker logs 看不到✅ 确保:
log.SetOutput(nil)✅ 查看:
docker logs <container>
f, _ := os.OpenFile("/var/log/app.log", os.O_CREATE|os.O_APPEND, 0644)
log.SetOutput(f)
Debian 上:
/var/log 默认 root 可写✅ 排查:
ls -l /var/log/app.log
sudo chown app:app /var/log/app.log
如果你用的是:
log/syslog
Debian 上需要:
sudo apt install rsyslog
sudo systemctl enable rsyslog
sudo systemctl start rsyslog
否则日志会“消失”。
请逐条确认:
os.Exit() 导致缓冲没刷journalctl 查看日志你可以贴出:
我可以直接告诉你为什么是空的,以及怎么改。