在 CentOS 上运行 Golang 程序时“日志为空”,通常不是 Go 语言本身的问题,而是运行环境、输出方式或日志配置导致的。下面按常见原因逐一说明,并给出排查方法。
很多 Go 程序使用:
log.Println("xxx")
fmt.Println("xxx")
这些默认输出到:
如果你是通过 systemd 启动服务:
journalctl -u your-service
而不是看某个日志文件,就会“以为没日志”。
✅ 解决:
journalctl -u your-service -f
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
很多日志库(zap / logrus / slog)有级别:
logger.SetLevel(logrus.WarnLevel)
结果:
InfoDebug
全部被吞掉✅ 排查:
log.Println("test") // 一定会出现
常见错误:
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)
如果 main 里有:
log.Fatal(err)
程序直接退出,你可能什么都没看到。
✅ 检查:
ps aux | grep app
echo $?
例如 zap:
var logger *zap.Logger
logger.Info("hello") // panic 或空
✅ 正确:
logger, _ := zap.NewProduction()
defer logger.Sync()
✅ 解决:
Sync() / Flush()# 1. 看系统日志
journalctl -u your-service -f
# 2. 看进程
ps aux | grep your-app
# 3. 手动运行
./your-app
# 4. 检查代码
log.Println("started")
你可以贴出:
我可以直接告诉你具体是哪一步导致日志为空。