温馨提示×

debian golang日志为何不输出

小樊
42
2026-09-22 09:52:33
栏目: 编程语言

在 Debian 上用 Go 写程序时“日志不输出”,通常不是 Debian 本身的问题,而是日志写到了哪里、什么时候刷盘、以及你怎么运行的这三类原因。下面按最常见情况逐条排查。


一、最常见原因

1. 用了 log 但没看到输出(缓冲问题)

Go 的 log 默认是行缓冲 + 实时输出到 stderr 的,一般没问题。
但如果你:

  • 把输出重定向到文件
  • 在 systemd / nohup / docker 中运行
  • 程序没正常退出

就可能出现“看起来没输出”。

✅ 验证方式:

log.Println("hello")
time.Sleep(time.Second)

如果 Ctrl+C 或正常退出后才有日志,说明是缓冲/未刷新


2. 输出到了 stderr,而你只看 stdout

Go 的 log 默认写 stderr,不是 stdout。

./app        # 可能看不到
./app 2>&1   # 才能看到

✅ 正确查看:

./app 2>&1 | tee log.txt

3. systemd 服务没配置日志输出

如果你是用 systemd 跑的:

[Service]
ExecStart=/opt/app

日志不会“打印到终端”,而是在:

journalctl -u yourapp.service -f

✅ 确认:

journalctl -u yourapp -n 50

4. 程序提前 panic / 退出

日志还没来得及写,程序就退了。

✅ 测试:

defer func() {
    if r := recover(); r != nil {
        log.Println("panic:", r)
    }
}()

二、常见错误写法

❌ 错误:自己实现了 logger 但没 Flush

logger := log.New(file, "", 0)
logger.Println("test")
// 没 Close / Flush

✅ 正确:

defer file.Close()

❌ 错误:写到 /var/log 但权限不足

Debian 下非 root 不能写系统日志目录。

log.SetOutput(os.OpenFile("/var/log/app.log", ...))

静默失败

✅ 检查:

ls -l /var/log/app.log
id

三、Docker / Debian 容器常见问题

Docker 中看不到日志

因为:

  • 没输出到 stdout/stderr
  • 或用了文件

✅ 正确做法:

log.SetOutput(os.Stdout)

Docker 只能看 stdout/stderr:

docker logs container

四、快速自检清单 ✅

请确认:

  • [ ] 用的是 log.Println 还是自己写的?
  • [ ] 是否运行在 systemd / docker?
  • [ ] 是否重定向了输出?
  • [ ] 是否查看了 stderr?
  • [ ] 程序是否正常运行并退出?

五、建议你这样贴信息(便于精准定位)

你可以补充:

  1. 运行方式(终端 / systemd / docker)
  2. 日志代码片段
  3. 是否重定向或写文件
  4. Debian 版本(cat /etc/os-release

我可以一步一步帮你定位到具体哪一行导致不输出

0