supervisor运行python,日志输出到stderr_logfile
描述:使用supervisor启动python代码,日志输出到stderr_logfile中而不是期望的stdout_logfile中
根本原因:Python 的 logging 模块默认将所有日志(包括 INFO、DEBUG)输出到 stderr,而不是 stdout。logger.info(), logger.debug(), logger.warning() 等 非 error/critical 级别的日志
默认输出到 sys.stderr,而不是 sys.stdout。
虽然这听起来反直觉(因为不是“错误”),但这是 Python 标准库的设计:
“常规输出” 走 stdout,而 “诊断信息”(包括日志)走 stderr,以便在管道、重定向时分离。
解决方案
✅ 方法一:修改 Python 代码,让 logger 输出到 stdout
import logging
import sys
# 清除默认 handler
for handler in logging.root.handlers[:]:
logging.root.removeHandler(handler)
# 设置 handler 输出到 stdout
handler = logging.StreamHandler(sys.stdout)
handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))
logging.getLogger().addHandler(handler)
logging.getLogger().setLevel(logging.INFO)
这样,logger.info()、logger.warning() 等都会走 stdout,进入 tax-resource.log。
⚠️ 注意:logger.error() 和 logger.critical() 你可能仍希望走 stderr,可以单独处理。
✅ 方法二:统一日志到一个文件(推荐)
如果你不关心 stdout 和 stderr 分开,可以只用一个日志文件:
深色版本
[program:tax_resource]
command=...
stdout_logfile=/home/gptter/tax_resource/logs/tax-resource.log
stderr_logfile=/home/gptter/tax_resource/logs/tax-resource.log ; 两者指向同一个文件
或者直接合并:
stdout_logfile=/home/gptter/tax_resource/logs/tax-resource.log
redirect_stderr=true ; 把 stderr 重定向到 stdout
✅ 推荐使用 redirect_stderr=true:
[program:tax_resource]
command=...
directory=/home/gptter/tax_resource
autostart=true
autorestart=true
user=root
stdout_logfile=/home/gptter/tax_resource/logs/tax-resource.log
redirect_stderr=true ; 👈 关键:把 stderr 合并到 stdout
这样所有日志(包括 logging 输出)都会进入 tax-resource.log,不会分散。
✅ 方法三:使用文件 handler(最佳实践)
最推荐的方式是:在 Python 代码中直接写入日志文件,而不是依赖 print 或 logging 走标准流。
import logging
from logging.handlers import RotatingFileHandler
handler = RotatingFileHandler('logs/app.log', maxBytes=10*1024*1024, backupCount=5)
handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))
logging.getLogger().addHandler(handler)
logging.getLogger().setLevel(logging.INFO)
然后 Supervisor 配置中可以只保留 stdout 和 stderr 用于捕获异常或打印输出。

浙公网安备 33010602011771号