温馨提示×

golang日志centos不输出吗

小樊
42
2026-10-06 01:54:30
栏目: 编程语言

在 CentOS 上 Golang 程序“日志不输出”通常不是因为系统本身屏蔽了日志,而是输出位置、缓冲、系统服务方式、权限等问题。下面按常见原因给你排查清单。


一、最常见的几种情况

1️⃣ 用 log.Println / fmt.Println,但看不到输出

情况 A:程序以后台服务运行(systemd)

如果你是用:

systemctl start yourapp

那么:

  • fmt.Println / log 默认输出到 stdout / stderr
  • systemd 会把它重定向到 journal

✅ 正确查看方式:

journalctl -u yourapp.service

❌ 错误方式:

ps 看进程
tail -f 某个文件  (你没写文件当然没内容)

2️⃣ 日志被缓冲了(常见于非终端)

如果 stdout 不是终端(比如 pipe、systemd、nohup):

  • Go 的 fmt / log 不会实时 flush
  • 程序退出才看到

✅ 建议:

  • 使用 log 包(默认有换行 flush)
  • 或显式 os.Stdout.Sync()
  • 或写文件

3️⃣ 你以为“没输出”,其实输出到了文件

很多人写的是:

log.SetOutput(file)

但:

  • 文件路径是相对路径
  • CentOS 上工作目录不是你以为的目录

✅ 排查:

lsof -p 进程ID

或打印:

log.Println(os.Getwd())

4️⃣ systemd 服务文件没配好

示例正确 service:

[Unit]
Description=go app

[Service]
ExecStart=/opt/app/app
WorkingDirectory=/opt/app
User=appuser
Restart=always
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

5️⃣ SELinux 阻止写日志文件(很常见)

如果日志写到:

/var/log/myapp.log

但没权限或 SELinux 限制:

✅ 检查:

getenforce
ls -Z /var/log/myapp.log

✅ 临时验证:

setenforce 0

二、推荐在 CentOS 上的正确日志方式

✅ 方式 1(最简单,推荐)

直接用标准日志 → systemd journal

log.Println("start")
journalctl -u yourapp -f

✅ 方式 2(生产推荐)

写文件 + log rotate

log.SetOutput(&lumberjack.Logger{
    Filename:   "/var/log/myapp/app.log",
    MaxSize:    100,
    MaxBackups: 5,
})

✅ 方式 3(高级)

用 zap / logrus


三、快速自检清单 ✅

请你确认:

  1. 程序是怎么启动的?(手动 / systemd / docker)
  2. 用的是 fmt 还是 log?
  3. 日志是终端还是文件?
  4. 有没有 journalctl 查看?
  5. 是否在 CentOS 7 / 8 / Stream?

如果你愿意,可以把:

  • 启动方式
  • Go 日志代码
  • systemd 文件(如果有)

贴出来,我可以直接帮你定位“为什么没输出”。

0 踩