温馨提示×

Debian Golang日志为何丢失

小樊
37
2026-08-11 21:13:48
栏目: 编程语言

Debian 上 Golang 程序日志“丢失”,通常不是 Go 本身的问题,而是 运行环境、输出方式、systemd / 容器、日志收集配置 导致。下面按最常见原因 → 排查方法 → 解决方案给你一个系统性的说明。


一、最常见原因(90% 都在这里)

1️⃣ stdout / stderr 被 systemd 吞掉(最常见)

如果你用 systemd 启动 Go 程序:

[Service]
ExecStart=/usr/local/bin/app

Go 的 log / fmt.Println 默认输出到 stdout / stderr
systemd 不会自动把 stdout 写到文件

现象

  • 程序在终端运行有日志
  • systemd 启动后 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))

2️⃣ 日志被缓冲(stdout 是行缓冲)

现象

  • 程序运行很久才看到日志
  • 或程序异常退出时日志全没了

原因

  • stdout 是 块缓冲
  • 程序没 flush

解决

使用带 flush 的 logger

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

不要只用 fmt.Println 做日志

使用成熟日志库

  • log/slog(Go 1.21+ 推荐)
  • zap
  • logrus

3️⃣ 程序以 daemon / nohup 方式运行

nohup ./app &

❌ stdout 被重定向到 nohup.out
❌ 可能没权限 / 路径不对

✅ 建议:

  • 明确日志路径
  • 不要用 nohup 跑服务

4️⃣ systemd 重启太快,日志还没写

现象

  • 程序启动失败
  • 日志“消失”

排查

journalctl -u your-service --since "5 min ago"

✅ 检查:

[Service]
Restart=on-failure
RestartSec=5

5️⃣ Debian 默认日志轮转导致文件“消失”

/var/log/app.log

logrotate 截断或删除

✅ 检查:

ls -l /var/log/app.log
cat /etc/logrotate.d/*

✅ 正确做法:

  • 使用 日志库自动 reopen
  • 或输出到 systemd journal

二、Go 日志最佳实践(Debian 推荐)

✅ 推荐方案 1:systemd + journal(最稳)

[Service]
StandardOutput=journal
StandardError=journal
log.Println("hello")
journalctl -u app -f

✅ 不丢日志
✅ 自动轮转
✅ 支持时间戳、PID


✅ 推荐方案 2:slog(Go 1.21+)

logger := slog.New(slog.NewTextHandler(os.Stdout, nil))
logger.Info("service start")

三、快速自检清单 ✅

你可以逐条确认:

  • [ ] 程序是否用 systemd 启动?
  • [ ] 日志是 stdout 还是写文件?
  • [ ] 是否用了 fmt.Println 而不是 logger?
  • [ ] 是否查看 journalctl
  • [ ] 是否有 logrotate?
  • [ ] 程序是否正常退出(flush)?

四、如果你愿意,我可以直接帮你定位

你可以贴出:

  1. systemd service 文件
  2. Go 日志相关代码
  3. 程序启动方式
  4. Debian 版本

我可以直接告诉你 哪一行导致日志丢失,以及怎么改

0