gpt4 book ai didi

python - 如何在 Python 中使用 gunicorn 的日志记录模块

转载 作者:太空宇宙 更新时间:2023-11-03 15:39:16 25 4
gpt4 key购买 nike

我有一个基于 flask 的应用程序。当我在本地运行它时,我从命令行运行它,但是当我部署它时,我使用 gunicorn 和多个 worker 启动它。

我想使用logging 模块来记录文件。我为此找到的文档是 https://docs.python.org/3/library/logging.htmlhttps://docs.python.org/3/howto/logging-cookbook.html .

当我的应用程序可能使用 gunicorn 启动时,我对使用日志记录的正确方法感到困惑。文档解决了线程问题,但假设我可以控制主进程。混淆点:

logger = logging.getLogger('myapp') 会在不同的 gunicorn 工作线程中返回相同的记录器对象吗?

如果我将日志记录 FileHandler 附加到我的记录器以便记录到一个文件,我如何才能避免在不同的 worker 中多次执行此操作?

我的理解 - 这可能是错误的 - 如果我只是调用 logger.setLevel(logging.DEBUG),这将通过可能具有更高默认日志记录级别的根记录器发送消息,并且可能会忽略调试消息,因此我需要调用logging.basicConfig(logging.DEBUG) 以使我的调试消息通过。但是文档说不要从线程调用 logging.basicConfig()。使用 gunicorn 时如何正确设置根日志记录级别?或者我不需要?

最佳答案

这是我典型的 Flask/Gunicorn 设置。注意 gunicorn 是通过 supervisor 运行的。

wsgi_web.py。注意 ProxyFix 从 Nginx 获取客户端的真实 IP 地址。

from werkzeug.contrib.fixers import ProxyFix
from app import create_app
import logging

gunicorn_logger = logging.getLogger('gunicorn.error')

application = create_app(logger_override=gunicorn_logger)
application.wsgi_app = ProxyFix(application.wsgi_app, num_proxies=1)

编辑 2020 年 2 月,对于较新版本的 werkzeug,请使用以下内容并根据需要将参数调整为 ProxyFix:

from werkzeug.middleware.proxy_fix import ProxyFix
from app import create_app
import logging

gunicorn_logger = logging.getLogger('gunicorn.error')

application = create_app(logger_override=gunicorn_logger)
application.wsgi_app = ProxyFix(application.wsgi_app, x_for=1, x_host=1)

Flask 应用工厂 create_app

def create_app(logger_override=None):
app = Flask(__name__)

if logger_override:

# working solely with the flask logger
app.logger.handlers = logger_override.handlers
app.logger.setLevel(logger_override.level)

# OR, working with multiple loggers

# for logger in (app.logger, logging.getLogger('sqlalchemy')):
# logger.handlers = logger_override.handlers
# logger.setLevel(logger_override.level)

# more

return app

supervisor conf 中的 Gunicorn 命令(第 4 行),注意 --log-level 参数在本例中已设置为 info。注意 X-REAL-IP 传递给访问 --access-logformat

[program:web]
directory = /home/paul/www/example
environment = APP_SETTINGS="app.config.ProductionConfig"
command = /home/paul/.virtualenvs/example/bin/gunicorn wsgi_web:application -b localhost:8000 --workers 3 --worker-class gevent --keep-alive 10 --log-level info --access-logfile /home/paul/www/logs/admin.gunicorn.access.log --error-logfile /home/paul/www/logs/admin.gunicorn.error.log --access-logformat '%%({X-REAL-IP}i)s %%(l)s %%(u)s %%(t)s "%%(r)s" %%(s)s %%(b)s "%%(f)s" "%%(a)s"'
user = paul
autostart=true
autorestart=true

关于python - 如何在 Python 中使用 gunicorn 的日志记录模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53548536/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com