温馨提示×

golang日志为何在debian为空

小樊
39
2026-09-07 06:11:29
栏目: 编程语言

在 Debian 上运行 Go 程序时“日志为空”,通常不是 Go 语言本身的问题,而是运行环境、日志输出目标或进程管理方式导致的。下面按常见原因逐一说明,并给出排查办法。


一、日志被写到了别的地方(最常见)

1. 日志写到文件,但你看了 stdout

很多 Go 程序:

log.SetOutput(file)

或:

log.Println -> 文件
fmt.Println -> 终端

现象:你在终端看不到任何日志。

✅ 排查:

  • 检查代码里是否设置了 log.SetOutput
  • 查找日志文件路径
  • lsof -p <pid> 看进程打开了哪些文件

二、systemd 下“看不到日志”

2. 用 systemd 启动,但没看 journal

在 Debian(尤其是 10+)中,服务通常由 systemd 管理:

sudo systemctl status your-service
journalctl -u your-service

如果程序只写 stdout/stderr,日志会在 journal,而不是你手动运行的终端。

✅ 正确做法:

journalctl -u your-service -f

❌ 错误假设:

“我 ssh 登录后啥也没看到,说明没日志”


三、程序以 daemon / nohup 方式运行

3. nohup / & 把输出吃掉了

nohup ./app &

默认会写到:

nohup.out

如果这个文件:

  • 没权限
  • 被重定向到 /dev/null

就会“完全没日志”

✅ 检查:

ls -l nohup.out
cat nohup.out

✅ 建议:

./app > /var/log/app.log 2>&1 &

四、日志级别过滤掉了

4. 用了 zap / logrus / slog,级别太高

例如:

logger := zap.NewNop()

或:

logrus.SetLevel(logrus.WarnLevel)

✅ 排查:

  • 是否初始化了 logger
  • 是否设置了 Debug/Warn/Error

五、程序根本没执行到日志代码

5. panic / 提前 exit

log.Println("start")
os.Exit(1)

或配置加载失败直接退出。

✅ 排查:

echo $?
./app; echo $?

六、Debian 特殊环境差异

6. 容器 / chroot / 最小化系统

  • 没有 /var/log
  • 没有 journal
  • 文件系统只读

✅ 测试:

touch /var/log/test && echo ok

七、一个最小验证示例

package main

import (
    "log"
    "os"
)

func main() {
    log.SetOutput(os.Stdout)
    log.Println("hello from go")
}

运行:

go run main.go

如果这里都没输出,那就是环境问题。


快速定位清单 ✅

  1. 程序是 直接运行 还是 systemd / docker
  2. 日志是 stdout 还是文件
  3. 是否 设置过 log output
  4. 是否在 journal / nohup.out / 指定文件
  5. 日志级别是否 过高
  6. 程序是否 提前退出

如果你愿意,可以把:

  • 启动方式(systemd? docker? 直接跑?)
  • 日志库(log / zap / logrus / slog)
  • 一小段代码

发出来,我可以直接帮你指出“为什么是空的”。

0