
Supervisor未能捕获Golang程序日志的排查与解决
在使用Supervisor管理Golang应用时,经常会遇到日志无法被Supervisor正确记录的问题。本文将分析一个典型案例,其中Supervisor配置看似无误,但/var/log/supervisor/golang-server.log文件却始终为空,Supervisor自身日志也未报错。
问题场景: 用户使用Supervisor管理一个Golang服务,Supervisor配置文件如下:
[supervisord] http_port=/var/tmp/supervisor.sock pidfile=/var/run/supervisord.pid logfile=/var/log/supervisor/supervisord.log; [program:golang-server] directory=/data/wwwroot/ command=/data/wwwroot/golang-server autostart=true autorestart=true stdout_logfile=/var/log/supervisor/golang-server.log stderr_logfile=/var/log/supervisor/golang-server.log
服务运行正常,但日志文件为空。
立即学习“go语言免费学习笔记(深入)”;
问题根因: 问题的核心在于Golang程序的日志输出机制。Supervisor的stdout_logfile和stderr_logfile选项仅捕获程序的标准输出(stdout)和标准错误输出(stderr)。如果Golang程序使用日志库(例如log包)将日志输出到其他位置,例如自定义文件、syslog、日志服务器或消息队列(如Kafka),Supervisor将无法获取这些日志。
即使Golang程序未对日志库进行自定义配置,日志默认输出到标准输出和标准错误输出。但一旦使用了log.SetOutput()等函数重定向日志输出,Supervisor配置的日志文件将保持为空。
解决方法: 仔细检查Golang代码,确保日志正确输出到标准输出或标准错误输出。如果使用了日志库并进行了自定义配置,请将日志输出重定向回标准输出或标准错误输出,以便Supervisor能够正确捕获日志。 这通常需要修改Golang程序的日志配置,例如将日志写入os.Stdout或os.Stderr。










