温馨提示×

golang日志centos丢失原因

小樊
46
2026-10-06 01:44:02
栏目: 编程语言

在 CentOS 上运行 Golang 程序,日志“丢失”通常不是 Go 本身的问题,而是运行环境、日志写入方式或系统配置导致的。下面按常见原因 → 排查方法 → 解决方案说明。


一、最常见原因(90% 情况)

1️⃣ 日志写到了 stdout / stderr,但被 systemd 吞了

如果你用 systemd 启动 Go 程序,而代码里只是:

log.Println("xxx")
fmt.Println("xxx")

这些日志会进入 journald,而不是文件。

表现

  • 文件里没日志
  • journalctl -u your-service 能看到

解决

✅ 明确写文件:

log.SetOutput(os.OpenFile("/var/log/app.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644))

或

journalctl -u your-service -f

2️⃣ 程序以 nohup ./app & 启动,但终端关闭

nohup ./app &

如果没重定向:

nohup ./app > /var/log/app.log 2>&1 &

日志可能:

  • 写到了已关闭的终端
  • 或根本没写

3️⃣ 日志目录不存在 / 没有权限(CentOS 常见)

CentOS 默认:

  • /var/log 需要 root
  • SELinux 可能阻止写入

错误示例

os.OpenFile("/var/log/app.log", ...)

非 root 用户运行 → 失败但被忽略

排查

ls -ld /var/log
id
getenforce

解决

  • 用普通用户目录:
/var/lib/app/log/
  • 或授权:
sudo chown -R appuser /var/log/app

二、Go 代码层面的“假丢失”

4️⃣ 日志没 flush(bufio / 自定义 writer)

w := bufio.NewWriter(f)
w.WriteString("log")
// 没 w.Flush()

进程崩了 → 缓冲丢失

✅ 用:

log.SetOutput(w)
defer w.Flush()

5️⃣ 程序 panic / 被 kill,没写日志

  • OOM
  • kill -9
  • 容器退出

排查

dmesg | grep -i oom
journalctl -u your-service

三、CentOS 特有原因

6️⃣ logrotate 把日志“转走”了

CentOS 默认:

  • /var/log/* 会 rotate
  • 老文件改名 app.log-20260101

你可能只看了 app.log

✅ 检查:

ls -lh /var/log/app*

7️⃣ SELinux 禁止写日志

getenforce

如果是 Enforcing:

ausearch -m avc -ts recent

✅ 解决:

setenforce 0  # 临时
# 或加策略

四、容器 / systemd 场景

8️⃣ Docker + CentOS

  • 日志在容器里
  • 容器退出就没了

✅ 挂载卷:

-v /data/log:/app/log

五、推荐稳定日志方案(CentOS + Go)

✅ 最佳实践

logFile, _ := os.OpenFile("/var/lib/app/app.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
log.SetOutput(logFile)

✅ 或用库:

  • zap
  • logrus

✅ systemd 示例:

[Service]
ExecStart=/usr/local/bin/app
StandardOutput=append:/var/log/app.log
StandardError=append:/var/log/app.log

六、快速自查清单 ✅

  • [ ] 日志是写文件还是 stdout?
  • [ ] 程序怎么启动(systemd / nohup / docker)?
  • [ ] 日志目录是否存在 & 有权限?
  • [ ] SELinux 是否开启?
  • [ ] 是否 logrotate?
  • [ ] 程序是否异常退出?

如果你愿意,可以贴:

  • 启动方式(systemd / shell)
  • 日志代码
  • CentOS 版本

我可以精准定位是哪一条原因。

0 踩