
supervisor 无法持续写入应用日志,通常由权限配置错误、日志路径未显式指定、程序输出未正确重定向至 stdout/stderr 或 supervisord 自身异常引起。本文系统梳理排查步骤与修复方法。
supervisor 无法持续写入应用日志,通常由权限配置错误、日志路径未显式指定、程序输出未正确重定向至 stdout/stderr 或 supervisord 自身异常引起。本文系统梳理排查步骤与修复方法。
当 Supervisor 管理的 Go 应用日志在 /var/log/supervisor/ 下停止更新时,并非一定是程序崩溃,而更可能是日志管道中断或配置失配。以下是关键排查方向与实操建议:
✅ 1. 检查日志文件权限与归属
Supervisor 子进程默认以 user(配置中指定)或 supervisord 启动用户身份运行。若日志文件由 root 或其他用户预先创建,且权限不足(如仅属主可写),Supervisor 将静默失败。
验证命令:
ls -l /var/log/supervisor/your_app.log # 正确示例(假设 supervisord 以 www-data 运行): # -rw-r--r-- 1 www-data www-data 12345 Jun 10 14:22 your_app.log
修复方式:
sudo chown www-data:www-data /var/log/supervisor/your_app.log sudo chmod 644 /var/log/supervisor/your_app.log # 若目录不存在,一并授权: sudo mkdir -p /var/log/supervisor sudo chown www-data:www-data /var/log/supervisor
✅ 2. 显式声明日志路径,避免自动命名冲突
若配置中未设置 stdout_logfile 和 stderr_logfile,Supervisor 会自动生成带唯一后缀(如 .log.12345)的文件,旧日志可能被轮转丢弃,导致“无新日志”错觉。
推荐配置(/etc/supervisor/conf.d/your_app.conf):
[program:your_go_app] command=/path/to/your/app directory=/path/to/app user=www-data autostart=true autorestart=true stdout_logfile=/var/log/supervisor/your_app.stdout.log stderr_logfile=/var/log/supervisor/your_app.stderr.log stdout_logfile_maxbytes=10MB stdout_logfile_backups=5 redirect_stderr=true ; 将 stderr 合并到 stdout 日志(可选)
⚠️ 注意:
stdout_logfile必须为绝对路径,且 Supervisor 不会自动创建父目录——需手动确保/var/log/supervisor存在并可写。
✅ 3. 确保 Go 程序输出流向 stdout/stderr
Supervisor 仅捕获子进程的标准输出与标准错误流。若你的 Go 程序使用 log.SetOutput() 写入文件、或通过 os.OpenFile() 直接写磁盘,则日志完全绕过 Supervisor,不会出现在配置的日志文件中。
正确做法(Go 示例):
package main
import (
"log"
"os"
)
func main() {
// ✅ 正确:输出到 os.Stdout(被 Supervisor 捕获)
log.SetOutput(os.Stdout)
log.Println("Application started")
// ❌ 错误:写入独立文件,Supervisor 无法捕获
// file, _ := os.OpenFile("/tmp/app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
// log.SetOutput(file)
}
✅ 4. 查阅 Supervisor 自身日志定位深层问题
Supervisor 的主进程日志(默认 /var/log/supervisor/supervisord.log)常包含关键线索,例如:
-
ERROR Unhandled exception in child process(子进程崩溃) -
WARN 'your_app' (pid XXXX) exited unexpectedly(意外退出) -
IOError: [Errno 13] Permission denied(权限拒绝)
执行sudo tail -n 50 /var/log/supervisor/supervisord.log快速筛查。
✅ 补充建议
-
重启生效:修改配置后务必执行
sudo supervisorctl reread && sudo supervisorctl update; -
实时观察:用
sudo supervisorctl tail -f your_app stdout直接查看实时输出; - 参考文档:深入理解日志机制请阅读 Supervisor 官方日志指南。
遵循以上步骤,90% 以上的 Supervisor 日志写入中断问题均可定位并解决。核心原则是:显式控制路径、严格校验权限、确保输出流向、善用主日志诊断。










