微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决使用 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 举报,一经查实,本站将立刻删除。