在 Debian 上用 Go 写程序时“日志不输出”,通常不是 Debian 本身的问题,而是日志写到了哪里、什么时候刷盘、以及你怎么运行的这三类原因。下面按最常见情况逐条排查。
log 但没看到输出(缓冲问题)Go 的 log 默认是行缓冲 + 实时输出到 stderr 的,一般没问题。
但如果你:
就可能出现“看起来没输出”。
✅ 验证方式:
log.Println("hello")
time.Sleep(time.Second)
如果 Ctrl+C 或正常退出后才有日志,说明是缓冲/未刷新。
Go 的 log 默认写 stderr,不是 stdout。
./app # 可能看不到
./app 2>&1 # 才能看到
✅ 正确查看:
./app 2>&1 | tee log.txt
如果你是用 systemd 跑的:
[Service]
ExecStart=/opt/app
日志不会“打印到终端”,而是在:
journalctl -u yourapp.service -f
✅ 确认:
journalctl -u yourapp -n 50
日志还没来得及写,程序就退了。
✅ 测试:
defer func() {
if r := recover(); r != nil {
log.Println("panic:", r)
}
}()
logger := log.New(file, "", 0)
logger.Println("test")
// 没 Close / Flush
✅ 正确:
defer file.Close()
Debian 下非 root 不能写系统日志目录。
log.SetOutput(os.OpenFile("/var/log/app.log", ...))
会静默失败。
✅ 检查:
ls -l /var/log/app.log
id
因为:
✅ 正确做法:
log.SetOutput(os.Stdout)
Docker 只能看 stdout/stderr:
docker logs container
请确认:
log.Println 还是自己写的?你可以补充:
cat /etc/os-release)我可以一步一步帮你定位到具体哪一行导致不输出。