使用 gevent 工作程序类未在 gunicorn 中显示 Python 日志记录

问题描述

我创建了一个 Flask 应用程序,可以 ping 其主要端点以启动可能持续长达几个小时的长时间运行的功能。当这个端点被命中时,我使用 Flask-executor,它是 ThreadPoolExecutor 的包装器,来排队这个长时间运行的任务。这是用于排队任务的代码executor.submit(start_crawl,id)

我在我的应用程序的根 __init__.py 文件中进行了我的烧瓶设置,它看起来像这样(至少,在另一个文件中定义为蓝图并导入的路由):

app = Flask(__name__)
executor = Executor(app)

logging.basicConfig(level=logging.INFO)
handler = logging.StreamHandler()
handler.setLevel(logging.INFO)
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
logger.addHandler(default_handler)
logger.addHandler(handler)

# https://trstringer.com/logging-flask-gunicorn-the-manageable-way/
if __name__ != '__main__':
    gunicorn_logger = logging.getLogger('gunicorn.error')
    app.logger.handlers.extend(gunicorn_logger.handlers)
    logger.handlers.extend(gunicorn_logger.handlers)

if __name__ == '__main__':
    app.run(port=int(os.environ.get('PORT',5000)))

接下来,在这个漫长任务中运行的代码的各个部分,我使用以下设置来记录信息:

logger = logging.getLogger(__name__)
logger.info("some info here")

当我使用 Flask 开发服务器运行此代码时,它运行良好,并且所有日志消息都按照我希望的方式显示。但是,当我像这样使用 gunicorn 运行服务器时: nohup gunicorn -w 1 src:app -b 127.0.0.1:5000 --worker-class gevent > ./gunicorn_log.out 2> ./gunicorn_log.out & > /dev/null 2> /dev/null 我没有从长时间运行的代码中获得任何我自己的日志消息。我曾尝试将 --log-level info--log-level INFO 添加到 gunicorn 启动命令,但这没有效果。此外,当我将 worker 类更改为认的同步 worker 时,代码会按预期记录,所以我认为这可能是某种 gevent 问题。我认为值得注意的是,长时间运行的函数可能会从其他线程中生成和记录,并且这些线程部分中使用的第三方库中的日志确实会被提取并记录到 gunicorn 日志文件中。我也尝试了许多不同的处理程序设置,例如将更多或更少的处理程序附加到我在 init 中设置的记录器,但无济于事。有没有人遇到过类似的问题?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)