温馨提示×

Golang日志为何不显示

小樊
38
2026-08-23 17:03:29
栏目: 编程语言

在 Go 里“日志不显示”通常是输出位置、日志级别、日志库配置或运行时问题导致的。下面按常见原因给你一个排查清单,基本能覆盖 90% 的情况。


一、最常见原因

1️⃣ 日志输出到了 stderr,而不是你盯着的地方

Go 标准库:

log.Print("hello")

默认输出到:

  • 标准错误(stderr)
  • 而不是 stdout

✅ 表现:

  • 你在终端里 ./app | grep xxx 看不到
  • 直接运行却能看到

✅ 解决:

./app 2>&1

或重定向:

./app > out.log 2>&1

2️⃣ 使用了 log.SetOutput,但输出到文件 / io.Discard

例如:

log.SetOutput(io.Discard)

或:

f, _ := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY, 0644)
log.SetOutput(f)

✅ 表现:

  • 控制台看不到
  • 日志在文件里

✅ 检查:

log.SetOutput(os.Stdout)

3️⃣ 程序提前退出,日志还没输出

例如:

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

⚠️ os.Exit 不会执行 buffer flush

✅ 解决:

  • return
  • 或确保 flush
  • 或不用 os.Exit

4️⃣ 使用了第三方日志库但没初始化

例如 logrus / zap

log := logrus.New()
log.SetOutput(io.Discard) // 误配置

或:

logger, _ := zap.NewProduction()
defer logger.Sync()

✅ 检查:

  • 是否调用了 Sync()
  • 是否设置了 SetOutput

5️⃣ 日志级别过滤(非常常见)

logrus

log := logrus.New()
log.SetLevel(logrus.WarnLevel)
log.Info("hello") // 不会显示

✅ 解决:

log.SetLevel(logrus.InfoLevel)

zap 同理:

  • NewProduction 默认不显示 Debug

6️⃣ 日志被缓冲,程序异常退出

例如:

  • 输出到文件
  • 程序 panic / kill

✅ 解决:

defer logger.Sync()

或:

log.SetFlags(log.Lshortfile | log.LstdFlags)

二、标准库 vs 常见库对照

✅ 标准库 log

log.Println("hello")
  • 默认 stderr
  • 无级别
  • 无 buffer

✅ logrus

logrus.Info("hello")
  • 默认 stderr
  • 有级别
  • 可配置输出

✅ zap

logger.Info("hello")
  • 默认 stdout
  • Debug 默认关闭
  • 必须 Sync

三、快速自检清单 ✅

你可以用这个 checklist 快速定位:

  1. 是不是 stderr
  2. 有没有 SetOutput
  3. 有没有 os.Exit
  4. 是不是日志级别太高?
  5. 是不是 panic / kill 没 flush?
  6. 是不是输出到文件但你没看?

四、最小可运行示例(没问题版)

package main

import (
	"log"
	"os"
)

func main() {
	log.SetOutput(os.Stdout)
	log.SetFlags(log.LstdFlags | log.Lshortfile)
	log.Println("hello world")
}

如果你愿意,可以把具体代码 + 使用的日志库 + 运行方式贴出来,我可以直接帮你定位是哪一条原因。

0