温馨提示×

为什么Golang日志不显示

小樊
44
2026-07-13 01:13:04
栏目: 编程语言

Golang 日志“不显示”通常不是语言本身的问题,而是输出位置、时机、配置或运行方式导致的。下面按最常见原因 → 排查方法给你一个系统排查清单。


一、最常见原因速查

✅ 1. 日志输出到了 stderr,而不是 stdout

现象

  • 你用 fmt.Println 能看到
  • log 包却看不到

原因

log.Println("hello")

默认输出到 stderr,而不是 stdout。

验证

go run main.go 2>&1

解决

log.SetOutput(os.Stdout)

✅ 2. 程序提前退出,日志还没来得及输出

现象

  • 程序一闪而过
  • 没有任何日志

原因

  • os.Exit()
  • panic
  • goroutine 来不及执行

示例

package main

import "log"

func main() {
    go log.Println("不会显示")
    os.Exit(0)
}

解决

  • 不要用 os.Exit(0) 直接退出
  • 或确保主 goroutine 等待
time.Sleep(time.Second)

✅ 3. 日志被日志库过滤掉了(级别问题)

现象

  • 使用 logrus / zap / zerolog
  • 只看到 error,看不到 info / debug

原因

  • 日志级别设置过高

示例(logrus)

log.SetLevel(log.WarnLevel)

解决

log.SetLevel(log.DebugLevel)

✅ 4. 日志输出被重定向了

现象

  • 本地能显示
  • 线上 / Docker / systemd 看不到

原因

  • 输出被重定向到文件
  • 或 stdout 被关闭

排查

ls /proc/<pid>/fd

Docker 常见

docker logs <container_id>

✅ 5. 日志在 goroutine 中,主程序已退出

现象

  • 日志写在 goroutine 里
  • 程序直接结束

示例

go func() {
    log.Println("hello")
}()

解决

var wg sync.WaitGroup
wg.Add(1)
go func() {
    defer wg.Done()
    log.Println("hello")
}()
wg.Wait()

✅ 6. 日志被 IDE / 终端缓冲

现象

  • 日志偶尔出现
  • 或程序结束后才显示

原因

  • stdout 行缓冲

解决

  • 输出换行符
  • 或强制刷新(部分库支持)

✅ 7. 使用了第三方日志库但没初始化

示例(zap)

logger, _ := zap.NewProduction()
logger.Info("hello")

Production 模式

  • 默认输出 JSON
  • 可能看不到在终端

解决

logger, _ := zap.NewDevelopment()

二、最小可运行示例(推荐对照)

package main

import (
    "log"
    "os"
)

func main() {
    log.SetOutput(os.Stdout)
    log.SetFlags(log.LstdFlags | log.Lshortfile)

    log.Println("✅ 日志正常显示")
}

三、快速自检清单

你可以逐条确认:

  • [ ] 用的是 log 还是第三方库?
  • [ ] 输出到 stdout 还是 stderr?
  • [ ] 是否有 os.Exit()
  • [ ] 是否在 goroutine 中?
  • [ ] 是否设置了日志级别?
  • [ ] 是否运行在 Docker / systemd?

四、我可以进一步帮你

如果你愿意,可以直接贴:

  1. 日志相关代码
  2. 运行方式(go run / build / Docker)
  3. 使用的日志库

我可以直接帮你定位是哪一条原因

0