温馨提示×

为什么debian golang无日志

小樊
48
2026-09-04 01:44:21
栏目: 编程语言

“Debian 上 Golang 程序没有日志”通常不是 Go 语言本身的问题,而是运行环境、配置或日志输出方式导致的。下面按常见原因给你一个系统排查清单。


一、最常见原因

1. 日志写到了 stdout / stderr,但你没看到

在 Debian(尤其是 systemd 服务)中:

  • fmt.Println / log.Println → 默认输出到 stderr
  • 如果你是直接运行:
    ./app
    
    应该能看到
  • 如果是 systemd 服务:
    journalctl -u your-service -f
    

✅ 检查:

journalctl -u your-service

2. 你用的是 log 库,但没设置输出位置

Go 默认:

log.Println("hello")

输出到 stderr

但如果你做了:

log.SetOutput(io.Discard)

或者:

log.SetOutput(file)

而文件没权限 / 路径不存在 → 没日志

✅ 检查:

log.SetOutput(os.Stderr)

3. systemd 服务没配置日志

典型的 Debian 服务:

[Service]
ExecStart=/opt/app/app

✅ 推荐配置:

StandardOutput=journal
StandardError=journal

否则日志可能“消失”。


4. 程序以 daemon / nohup 方式运行

例如:

nohup ./app &

日志可能:

  • 写到 nohup.out
  • 或完全丢弃

✅ 检查:

cat nohup.out

5. 你以为“没日志”,其实日志级别太高

如:

log.SetLevel(log.WarnLevel)

→ Info / Debug 不输出

✅ 检查日志库配置(zap / logrus / slog)


二、Debian 特有问题

6. apparmor / 权限问题

  • 日志文件在 /var/log
  • 程序无写权限

✅ 检查:

ls -l /var/log/yourapp
sudo -u appuser touch /var/log/yourapp/test

7. chroot / container 环境

  • 日志写到文件,但容器已退出
  • 或写到 tmpfs,看不到

三、最小化验证示例

package main

import (
    "log"
    "os"
)

func main() {
    log.SetOutput(os.Stderr)
    log.Println("test log")
}

运行:

go run main.go
journalctl -f

四、建议你补充的信息(我可以精准定位)

你可以贴出:

  1. 运行方式(systemd?shell?docker?)
  2. 用的日志库(log / logrus / zap / slog)
  3. 是否有 log.SetOutput
  4. Debian 版本(cat /etc/os-release

我可以直接告诉你“为什么没日志”。

0