Flask应用在uWsgi环境下Python fileConfig日志失效求助
解决uWSGI环境下Flask logging fileConfig无输出的问题
我之前也碰到过一模一样的情况:本地调试时日志输出正常,一部署到uWSGI就只生成空日志文件,完全看不到预期的日志内容。结合你的配置和uWSGI日志信息,给你几个可以尝试的解决方案:
1. 把日志文件路径改为绝对路径
虽然你的uWSGI日志显示当前工作目录是项目根目录,但实际运行时(比如用不同用户启动、或者uWSGI的启动路径有偏差),相对路径可能会指向错误的位置。直接修改logging.conf里的日志路径为绝对路径:
[handler_timedRotatingFileHandler] class=handlers.TimedRotatingFileHandler level=INFO formatter=simpleFormatter args=("/Users/user/project/logs/project.log", 'MIDNIGHT', 1, 0) # 第四个参数是备份文件计数,可选补充
同时要确保/Users/user/project/logs目录存在,并且uWSGI运行进程有该目录的读写权限。
2. 适配uWSGI对stdout的捕获机制
uWSGI默认会拦截Python的sys.stdout,导致你的consoleHandler输出被吃掉。可以通过两种方式解决:
- 修改StreamHandler指向uWSGI日志流:先在
app.py顶部添加import uwsgi,然后修改logging.conf里的控制台handler配置:[handler_consoleHandler] class=StreamHandler level=INFO formatter=simpleFormatter args=(uwsgi.stdout,) - 让uWSGI转发stdout到指定日志:在
uwsgi.ini里添加配置,把应用的stdout/stderr统一转发到uWSGI日志文件:[uwsgi] # 原有配置... logto = /Users/user/project/uwsgi.log stdout-logger = true stderr-logger = true
3. 启用uWSGI的Master进程
你的uWSGI日志里有个明显的警告:*** WARNING: you are running uWSGI without its master process manager ***。启用Master进程能更好地管理子进程的日志生命周期,在uwsgi.ini里添加:
master = true processes = 2 # 可选,根据服务器配置调整进程数,单进程也可以启用master
4. 启用Python线程支持
uWSGI默认关闭了Python线程支持,而Python的logging模块在多线程场景下(哪怕是单进程)需要线程安全的支持。在uwsgi.ini里添加:
enable-threads = true
5. 延迟日志配置初始化(可选)
有时候uWSGI加载应用的顺序会干扰日志配置的生效,你可以把日志初始化放到Flask应用启动后的第一个请求前:
# app.py import logging from logging.config import fileConfig from flask import Flask app = Flask(__name__) @app.before_first_request def setup_logging(): fileConfig('logging.conf', disable_existing_loggers=False) global logger logger = logging.getLogger(__name__) @app.route("/") def hello(): logger.info("Got request") return "<h1 style='color:blue'>Hello There!</h1>" if __name__ == '__main__': fileConfig('logging.conf', disable_existing_loggers=False) logger = logging.getLogger(__name__) app.run('0.0.0.0')
先试试前三个方案,应该就能解决日志空文件的问题了。
内容的提问来源于stack exchange,提问作者Timur
相关产品推荐
相关产品推荐

