温馨提示×

为何debian golang日志为空

小樊
41
2026-09-13 01:53:07
栏目: 编程语言

在 Debian 上运行 Go 程序时“日志为空”,通常不是 Debian 本身的问题,而是日志写到了你没看的地方,或者程序根本没执行到写日志的代码。下面按最常见原因逐一说明。


1. 你用的是 log 包,但没看 stdout / stderr

Go 标准库:

log.Println("hello")

默认输出到 stderr,不是文件。

常见误区

  • ./app > out.log日志在 out.log 里没有
  • 正确应该是:
    ./app > out.log 2>&1
    
    ./app 2>&1 | tee out.log
    

Debian 下 systemd 服务日志也是走 stderr


2. systemd 服务中“日志为空”

如果你是用 systemd 启动:

[Service]
ExecStart=/opt/app/app

那日志在:

journalctl -u your-service -f

而不是你期望的文件。

✅ 解决方式:

  • 看 journal:
    journalctl -u app.service
    
  • 或显式重定向:
    StandardOutput=append:/var/log/app.log
    StandardError=append:/var/log/app.log
    

3. 日志文件存在,但权限不足(Debian 常见)

Debian 默认:

  • 服务以 nobody / www-data 运行
  • /var/log 只有 root 可写
log.SetOutput(os.OpenFile("/var/log/app.log", ...))

如果没权限 → 直接 panic 或静默失败

✅ 检查:

ls -l /var/log/app.log
ps aux | grep app

4. 你用了日志库,但没 Flush

例如:

  • logrus
  • zap
  • zerolog
logrus.Info("start")
// 进程立刻退出

缓冲区没刷盘。

✅ 解决:

log.Sync() // zap

或在 main 结束前 sleep / 正常退出。


5. 程序根本没运行到日志逻辑

比如:

  • os.Exit(1) 在日志前
  • init() 中 panic
  • 配置错误直接 return

✅ 排查:

func main() {
    fmt.Println("main start") // 先确认进没进
    log.Println("log test")
}

6. 你以为“空”,其实被 rotate 或覆盖

Debian 常见:

  • logrotate
  • Docker 日志驱动
  • 容器 stdout 被吞

快速自查清单 ✅

# 1. 是否在 stderr
./app 2>&1 | cat

# 2. systemd
journalctl -u app -f

# 3. 文件权限
ls -l /var/log/app.log

# 4. 程序是否执行
strace -f ./app 2>&1 | grep write

如果你愿意,可以把:

  • 启动方式(命令行 / systemd / Docker)
  • 日志代码片段
  • Debian 版本

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

0