Debian 上 Golang 程序日志“丢失”,通常不是 Go 本身的问题,而是 运行环境、输出方式、systemd / 容器、日志收集配置 导致。下面按最常见原因 → 排查方法 → 解决方案给你一个系统性的说明。
如果你用 systemd 启动 Go 程序:
[Service]
ExecStart=/usr/local/bin/app
✅ Go 的 log / fmt.Println 默认输出到 stdout / stderr
❌ systemd 不会自动把 stdout 写到文件
journalctl -u xxx 也看不到✅ 方式一:让 systemd 接管日志(推荐)
[Service]
StandardOutput=journal
StandardError=journal
然后查看:
journalctl -u your-service -f
✅ 方式二:程序自己写文件
log.SetOutput(os.OpenFile("/var/log/app.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644))
✅ 使用带 flush 的 logger
log.SetFlags(log.LstdFlags | log.Lshortfile)
✅ 不要只用 fmt.Println 做日志
✅ 使用成熟日志库
log/slog(Go 1.21+ 推荐)zaplogrusnohup ./app &
❌ stdout 被重定向到 nohup.out
❌ 可能没权限 / 路径不对
✅ 建议:
journalctl -u your-service --since "5 min ago"
✅ 检查:
[Service]
Restart=on-failure
RestartSec=5
/var/log/app.log
被 logrotate 截断或删除
✅ 检查:
ls -l /var/log/app.log
cat /etc/logrotate.d/*
✅ 正确做法:
[Service]
StandardOutput=journal
StandardError=journal
log.Println("hello")
journalctl -u app -f
✅ 不丢日志
✅ 自动轮转
✅ 支持时间戳、PID
logger := slog.New(slog.NewTextHandler(os.Stdout, nil))
logger.Info("service start")
你可以逐条确认:
fmt.Println 而不是 logger?journalctl?你可以贴出:
我可以直接告诉你 哪一行导致日志丢失,以及怎么改。