Python日志记录未使用gevent worker类显示在gunicorn中

2024-04-16 16:32:15 发布

您现在位置: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 development server运行这段代码时,它工作正常,所有日志消息都按照我的要求显示出来。但是,当我使用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类更改为默认的sync worker时,代码会按预期记录,因此我认为这可能是某种gevent问题。我认为值得注意的是,长时间运行的函数可能会从其他线程生成并记录,而且这些线程部件中使用的第三方库的日志也会被提取并记录到gunicorn日志文件中。我也尝试了一系列不同的处理程序设置,比如将更多或更少的处理程序附加到我在init中设置的记录器上,但没有效果。有没有人有过类似的问题


Tags: 文件函数代码namelogappflasklogging