Rocky Linux 9中mod_wsgi输出日志至stderr无内容问题求助
解决Rocky Linux 9/RHEL9下mod_wsgi中Python logging无输出问题
直接解决方案(按优先级排序)
1. 绕过wsgi.errors,直接指定日志文件路径
RHEL9系列的mod_wsgi对wsgi.errors的处理逻辑有变更,直接使用FileHandler绑定具体日志文件是最稳妥的方式:
import logging # 初始化logger logger = logging.getLogger(__name__) logger.setLevel(logging.ERROR) # 必须显式设置日志级别,默认是WARNING # 绑定文件handler log_path = "/var/log/my_web_app/error.log" handler = logging.FileHandler(log_path) handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")) logger.addHandler(handler) # 测试输出 logger.error("测试日志内容")
后续操作:
- 创建日志目录并设置权限(确保mod_wsgi运行用户,通常是
apache,有读写权限):mkdir -p /var/log/my_web_app chown apache:apache /var/log/my_web_app chmod 750 /var/log/my_web_app chmod 640 /var/log/my_web_app/error.log
2. 强制包装wsgi.errors为标准文本流
如果必须使用wsgi.errors,可以将其转为标准TextIOWrapper对象后再传入StreamHandler:
import logging from io import TextIOWrapper def setup_logging(environ): logger = logging.getLogger(__name__) logger.setLevel(logging.ERROR) # 包装wsgi.errors为UTF-8编码的文本流 errors_stream = TextIOWrapper(environ["wsgi.errors"], encoding="utf-8") handler = logging.StreamHandler(errors_stream) handler.setFormatter(logging.Formatter("%(levelname)s: %(message)s")) logger.addHandler(handler) return logger # 在WSGI应用入口调用 def application(environ, start_response): logger = setup_logging(environ) logger.error("通过包装后的wsgi.errors输出日志") start_response("200 OK", [("Content-Type", "text/plain")]) return [b"Hello World"]
3. 禁用日志缓冲
RHEL9的mod_wsgi默认启用了输出缓冲,导致日志无法实时显示,可强制关闭:
# 在handler初始化后添加 handler.flush = True # 或者在日志输出后手动刷新 logger.error("测试内容") for handler in logger.handlers: handler.flush()
4. 检查mod_wsgi进程权限配置
确保httpd配置中WSGIDaemonProcess的运行用户拥有日志目录的读写权限:
# 在httpd.conf或虚拟主机配置中添加 WSGIDaemonProcess my_app user=apache group=apache threads=5 WSGIProcessGroup my_app
内容的提问来源于stack exchange,提问作者Juha Tuomala
相关产品推荐
相关产品推荐

