在 Go 里“日志不显示”通常是输出位置、日志级别、日志库配置或运行时问题导致的。下面按常见原因给你一个排查清单,基本能覆盖 90% 的情况。
stderr,而不是你盯着的地方Go 标准库:
log.Print("hello")
默认输出到:
✅ 表现:
./app | grep xxx 看不到✅ 解决:
./app 2>&1
或重定向:
./app > out.log 2>&1
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)
例如:
log.Println("start")
os.Exit(0)
⚠️ os.Exit 不会执行 buffer flush
✅ 解决:
returnos.Exit例如 logrus / zap:
log := logrus.New()
log.SetOutput(io.Discard) // 误配置
或:
logger, _ := zap.NewProduction()
defer logger.Sync()
✅ 检查:
Sync()SetOutput如 logrus:
log := logrus.New()
log.SetLevel(logrus.WarnLevel)
log.Info("hello") // 不会显示
✅ 解决:
log.SetLevel(logrus.InfoLevel)
zap 同理:
NewProduction 默认不显示 Debug例如:
✅ 解决:
defer logger.Sync()
或:
log.SetFlags(log.Lshortfile | log.LstdFlags)
loglog.Println("hello")
logrus.Info("hello")
logger.Info("hello")
你可以用这个 checklist 快速定位:
stderr?SetOutput?os.Exit?package main
import (
"log"
"os"
)
func main() {
log.SetOutput(os.Stdout)
log.SetFlags(log.LstdFlags | log.Lshortfile)
log.Println("hello world")
}
如果你愿意,可以把具体代码 + 使用的日志库 + 运行方式贴出来,我可以直接帮你定位是哪一条原因。