温馨提示×

centos为何golang日志缺失

小樊
35
2026-09-15 06:05:00
栏目: 编程语言

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


一、最常见原因汇总

1️⃣ 程序以 systemd 服务运行,但日志没写文件

很多人用 log.Println 或 fmt.Println,以为会写文件,其实:

  • stdout / stderr 被 journald 接管
  • 日志在 journalctl,不在你期望的文件里

✅ 查看方式:

journalctl -u your-service.service -f

2️⃣ 日志文件路径不存在 / 无权限

常见于:

log.SetOutput(os.OpenFile("/var/log/myapp.log", ...))

可能问题:

  • /var/log/myapp/ 目录不存在
  • 运行用户(如 nobody、www)无写权限

✅ 检查:

ls -ld /var/log/myapp
id your-user

3️⃣ 程序以 daemon / nohup 运行,但终端关闭

例如:

nohup ./app &

如果:

  • 没重定向输出
  • 或 shell 退出导致缓冲丢失

✅ 正确方式:

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

4️⃣ 日志被缓冲,程序异常退出未 flush

Golang:

  • log 包是即时写入
  • 但 自己用 bufio 或 os.File 写文件 可能不 flush

✅ 确保:

defer f.Close()

或使用:

  • log.SetOutput
  • zap / logrus(自动 flush)

5️⃣ SELinux 阻止写入

CentOS 默认开启 SELinux,可能:

  • 禁止写 /var/log
  • 禁止写自定义目录

✅ 快速验证:

setenforce 0

再观察日志是否出现。

✅ 永久解决(示例):

semanage fcontext -a -t var_log_t "/data/logs(/.*)?"
restorecon -Rv /data/logs

6️⃣ 日志级别 / 配置错误

例如:

  • 只输出 Error,但你认为应该有 Info
  • 环境变量没设置

✅ 检查:

log.SetLevel(log.InfoLevel)

7️⃣ 多进程 / 容器环境

  • Docker 中日志在容器层
  • K8s 中日志应在 stdout

✅ 推荐:

log.SetOutput(os.Stdout)

二、CentOS 推荐日志方案

✅ 标准做法(最稳)

log.SetOutput(os.Stdout)

然后:

  • systemd
  • docker logging
  • journald

统一管理


✅ 写文件(注意权限)

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

三、快速自查清单

# 1. 是否真的在运行
ps aux | grep yourapp

# 2. 日志到底在哪
journalctl -u yourapp -f

# 3. 文件权限
ls -l /var/log/yourapp

# 4. SELinux
getenforce

# 5. 输出是否被重定向
cat /proc/<pid>/fd/1

四、如果你愿意

你可以贴出:

  • Golang 日志代码示例
  • 启动方式(systemd / docker / nohup)
  • CentOS 版本

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

0 踩