温馨提示×

centos为啥golang日志为空

小樊
41
2026-09-09 03:53:41
栏目: 编程语言

在 CentOS 上遇到 Go 程序日志为空,通常不是 Go 本身的问题,而是运行环境或配置导致的。下面按最常见原因逐条排查:


1️⃣ 程序根本没执行到写日志的地方

最常见原因。

检查点:

  • 是否 os.Exit() 提前退出
  • 是否在 main() 之前 panic
  • 是否逻辑没走到日志函数

快速验证:

func main() {
    log.Println("start")
    // ...
}

如果连 start 都没有,说明程序没运行或被中断。


2️⃣ 日志写到了 stdout / stderr,但你看错地方

CentOS 上常见场景:

情况 A:systemd 服务

日志在 journal,不在文件

journalctl -u your-service -f

情况 B:nohup / 后台运行

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

但你可能看了别的日志文件

✅ 确认:

ls -l
cat nohup.out

3️⃣ 日志文件路径不存在或无权限

Go 不会自动创建目录

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

如果 /var/log/myapp 不存在:

  • 文件不会创建
  • 日志“看起来是空的”

✅ 检查:

ls -ld /var/log
touch /var/log/test.log

4️⃣ SELinux 阻止写入

CentOS 经典坑

即使权限对,SELinux 也可能拦

查看:

getenforce

如果是 Enforcing,试试:

setenforce 0

或给日志目录加权限:

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

5️⃣ 日志被缓冲,没 flush

如果你用的是:

  • bufio.Writer
  • 自定义 logger
  • 第三方库

程序退出太快,缓冲没写盘

✅ 解决:

defer logFile.Close()

或显式 flush


6️⃣ 你用的是 logrus / zap,但没配置 output

例如 zap:

logger, _ := zap.NewProduction()
defer logger.Sync()

如果不 Sync(),可能丢日志


7️⃣ 程序其实没在运行

确认进程是否存在:

ps aux | grep yourapp

或:

systemctl status yourapp

8️⃣ 用 Docker 跑的(附加)

日志在容器里:

docker logs container_id

✅ 快速自检清单

  • [ ] 程序真的运行了?
  • [ ] 日志往哪写(stdout / 文件)?
  • [ ] 文件路径存在且可写?
  • [ ] 是否 systemd / nohup / docker?
  • [ ] SELinux 是否拦截?
  • [ ] 是否提前 exit 或 panic?

如果你愿意,可以贴:

  • 运行方式(systemd / nohup / docker)
  • 日志相关 Go 代码
  • CentOS 版本

我可以直接帮你定位到具体原因。

0 踩