温馨提示×

centos为何golang日志为空

小樊
38
2026-10-06 01:31:29
栏目: 编程语言

在 CentOS 上运行 Golang 程序时“日志为空”,通常不是 Go 语言本身的问题,而是运行环境、输出方式或日志配置导致的。下面按常见原因逐一说明,并给出排查方法。


一、最常见原因

1️⃣ 日志输出到了 stdout / stderr,但你看错地方

很多 Go 程序使用:

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

这些默认输出到:

  • stdout(标准输出)
  • stderr(标准错误)

如果你是通过 systemd 启动服务:

journalctl -u your-service

而不是看某个日志文件,就会“以为没日志”。

✅ 解决:

journalctl -u your-service -f

2️⃣ 使用 systemd 但没 Redirect 标准输出

CentOS 7/8 默认用 systemd。

如果你的 service 文件类似:

[Service]
ExecStart=/opt/app/app

日志不会自动写文件,而是进 journal。

✅ 如果你想写文件:

StandardOutput=file:/var/log/app.log
StandardError=file:/var/log/app.err

或者:

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

3️⃣ 日志级别设置太高(Info/Warn 被忽略)

很多日志库(zap / logrus / slog)有级别:

logger.SetLevel(logrus.WarnLevel)

结果:

  • Info
  • Debug 全部被吞掉

✅ 排查:

log.Println("test") // 一定会出现

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

常见错误:

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

但:

  • /var/log/app/ 不存在
  • 程序以普通用户运行,无权限

✅ 检查:

ls -l /var/log/app.log
whoami

✅ 正确姿势:

os.MkdirAll("/var/log/app", 0755)

5️⃣ 程序没真正运行 / 启动即退出

如果 main 里有:

log.Fatal(err)

程序直接退出,你可能什么都没看到。

✅ 检查:

ps aux | grep app
echo $?

6️⃣ 用了日志库但没初始化

例如 zap:

var logger *zap.Logger
logger.Info("hello") // panic 或空

✅ 正确:

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

7️⃣ 输出被缓冲(少见但可能)

  • 某些日志库有 buffer
  • 程序异常退出,buffer 没 flush

✅ 解决:

  • 正常退出
  • 或显式 Sync() / Flush()

二、快速自查清单 ✅

# 1. 看系统日志
journalctl -u your-service -f

# 2. 看进程
ps aux | grep your-app

# 3. 手动运行
./your-app

# 4. 检查代码
log.Println("started")

三、如果你愿意,我可以进一步帮你

你可以贴出:

  • Go 日志代码片段
  • systemd service 文件
  • 启动方式(nohup / systemd / docker)

我可以直接告诉你具体是哪一步导致日志为空。

0 踩