能否将supervisord的stdout_logfile配置为命名管道文件而非普通文件?
supervisord配置stdout_logfile为命名管道(FIFO)的实现方案
直接在原有配置里把stdout_logfile路径改成FIFO路径会遇到两个核心问题:
- FIFO要求读端先打开,写端的open调用才会返回,否则supervisord启动时会阻塞在打开日志文件的步骤,无法拉起业务进程
- supervisord默认开启日志轮转逻辑,会对日志文件做截断、重命名操作,FIFO不支持这类文件操作,会触发报错
下面是可落地的实现方式:
方案一:基于原生日志配置对接FIFO
操作步骤
- 提前手动创建FIFO文件,执行命令:
mkfifo /tmp/raw.log,注意不要让supervisord自动创建该路径,否则会生成普通文件 - 提前部署FIFO的常驻读端程序,负责消费管道内的日志数据(比如对接日志采集agent、自定义日志处理逻辑、落盘存储都可以),必须保证读端在supervisord启动业务进程前处于运行状态
建议把读端程序也交给supervisord托管,将读端的
priority配置为比业务进程更小的值(supervisord中priority值越小启动优先级越高),避免读端晚启动导致阻塞 - 修改supervisord业务进程配置,关闭日志轮转,避免对FIFO执行不兼容的文件操作,参考配置如下:
command={command} priority=900 autorestart=true startsecs=5 startretries=5 redirect_stderr=true stdout_logfile=/tmp/raw.log stdout_logfile_maxbytes=0 stdout_logfile_backups=0
注意事项
- 禁止手动删除
/tmp/raw.log这个FIFO文件,否则supervisord下次重开日志时会自动在该路径创建普通文件,失去FIFO的效果 - 必须保证读端程序的稳定性,读端异常退出时,FIFO写端会收到
SIGPIPE信号,大概率导致业务进程异常退出 - 不要在FIFO路径上配置任何日志轮转、切割逻辑
方案二:在启动命令层做输出重定向(稳定性更高)
如果不想让supervisord的日志逻辑直接操作FIFO,可以把重定向逻辑放到业务启动命令里,supervisord本身只负责捕获空输出,避免阻塞启动流程,参考配置如下:
command=/bin/bash -c "exec {command} > /tmp/raw.log 2>&1" priority=900 autorestart=true startsecs=5 startretries=5 redirect_stderr=false stdout_logfile=/dev/null stdout_logfile_maxbytes=0
这种方案下supervisord不会感知FIFO的存在,不会在启动阶段阻塞在日志文件打开操作,容错性更高,同样需要提前创建FIFO、保证读端常驻。
官方配置规则说明
supervisord官方配置规则明确:当stdout_logfile指向FIFO、字符设备等特殊文件时,必须将stdout_logfile_maxbytes设置为0,关闭文件大小检测和轮转逻辑,否则会出现未定义的运行错误。
内容的提问来源于stack exchange,提问作者Bishnu
相关产品推荐
相关产品推荐

