温馨提示×

为什么debian golang日志为空

小樊
39
2026-09-01 05:16:13
栏目: 编程语言

在 Debian 上用 Go 写程序时“日志为空”,通常不是 Debian 本身的问题,而是日志写到哪里、程序是否真的运行、以及输出被谁吞掉了这几类原因。下面按常见情况给你一个排查清单。


1. 你用的是 log 包,但没看到输出

Go 标准库 log 默认输出到 标准错误(stderr),不是 stdout。

log.Println("hello")

如果你这样运行:

./app > out.log

那么日志会进 stderr,不在 out.log 里。

✅ 正确方式:

./app > out.log 2>&1

或只看 stderr:

./app 2> err.log

2. systemd 服务里日志为空(非常常见)

如果你在 Debian 用 systemd 跑 Go 程序:

[Service]
ExecStart=/opt/app/app

日志不会写文件,而是进 journald

查看日志:

journalctl -u your-service -f

如果你在代码里用 log.Println,它会自动进 journal。

✅ 确认:

  • 服务确实启动了(systemctl status
  • 没在代码里把日志重定向到 /dev/null

3. 程序根本没执行到日志代码

常见原因:

  • os.Exit() 在日志前
  • panic 在 init 里
  • 配置加载失败直接 return

建议加早期日志:

func main() {
    log.Println("start")
}

如果这一行都没有,说明:

  • 编译的不是这个文件
  • 或者运行的不是这个二进制

4. 你以为写了文件,但其实没有

比如:

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

但:

  • 路径是相对路径,工作目录不对
  • Debian 服务里工作目录默认是 /

✅ 用绝对路径:

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

并确保:

  • 目录存在
  • 用户有写权限

5. 日志被 buffer 没 flush

如果你用:

  • bufio.Writer
  • 自己封装的 logger
  • 第三方库但没 Flush()

程序退出时日志会丢。

✅ 确保:

  • 正常退出前 flush
  • 或用 log / zap(自带同步)

6. 用 Docker / cron 时“日志为空”

  • Docker:看 docker logs
  • cron:默认邮件 stderr,不写文件

快速自检清单 ✅

  1. 日志是 stdout 还是 stderr?
  2. 是手动运行还是 systemd / cron / docker?
  3. 日志文件是绝对路径吗?
  4. 程序真的跑起来了吗?
  5. 有没有早期 log.Println("start")

如果你愿意,可以把:

  • 运行方式(命令行 / systemd / docker)
  • 日志相关代码
  • Debian 版本

贴出来,我可以直接帮你定位是哪一条。

0