Как использовать модуль регистрации в Python с gunicorn - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть приложение на основе колбы.Когда я запускаю его локально, я запускаю его из командной строки, но при развертывании запускаю его с gunicorn с несколькими рабочими.

Я хочу использовать модуль logging для записи в файл.Документы, которые я нашел для этого: https://docs.python.org/3/library/logging.html и https://docs.python.org/3/howto/logging-cookbook.html.

Я не совсем понимаю, как правильно использовать ведение журнала, когда мое приложение может быть запущено с gunicorn.Документы адресуют потоки, но предполагают, что у меня есть контроль над основным процессом.Точки путаницы:

Будет ли logger = logging.getLogger('myapp') возвращать один и тот же объект логгера в разных рабочих потоках оружейных?

Если я присоединяю логгирование FileHandler к своему логгеру, чтобы войти в файлКак я могу избежать этого несколько раз на разных рабочих?

Мое понимание - что может быть неправильным - это то, что если я просто позвоню logger.setLevel(logging.DEBUG), это будет отправлять сообщения через корневой логгер, который может иметьболее высокий уровень ведения журнала по умолчанию и может игнорировать отладочные сообщения, и поэтому мне также необходимо вызвать logging.basicConfig(logging.DEBUG), чтобы мои отладочные сообщения могли пройти.Но в документах говорится, что нельзя звонить logging.basicConfig() из потока.Как правильно установить уровень ведения корневого журнала при использовании gunicorn?Или мне не нужно?

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Каждый работник представляет собой изолированный процесс со своей собственной памятью, поэтому вы не можете использовать один и тот же регистратор для разных работников.

Ваш код работает внутри этих работников, потому что основной процесс заботится только об управлении работниками.

Мастер-процесс - это простой цикл, который прослушивает различные сигналы процесса и реагирует соответствующим образом.Он управляет списком работающих работников, прослушивая такие сигналы, как TTIN, TTOU и CHLD.TTIN и TTOU говорят мастеру увеличить или уменьшить количество работающих работников.

В самом Gunicorn есть два основных режима работы

  • Sync
  • Async

Так что это отличается от многопоточности, это многопроцессорная обработка.

Однако, начиная с Gunicorn 19, опция потоков может использоваться для обработки запросов в нескольких потоках.Использование потоков предполагает использование gthread worker.

С учетом этого код регистрации будет записан один раз и будет вызываться несколько раз при каждом создании нового работника.Вы можете использовать шаблон Singelton, чтобы гарантировать, что один и тот же экземпляр регистратора используется внутри одного и того же работника.


Для настройки самого регистратора вам просто нужно следовать обычному процессу установки уровней корневого регистратора и различных уровней регистраторов.

basicConfig () не влияет на корневой обработчик, если он уже настроен:

Эта функция ничего не делает, если для корневого регистратора уже настроены обработчики.

Чтобы установить уровень наroot явно делает

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(name)

Тогда уровень можно установить на уровне обработчика или регистратора.

handler = logging.handlers.TimedRotatingFileHandler(log_path, when='midnight', backupCount=30)                                                                                                             
handler.setLevel(min_level)

Вы можете проверить этот аналогичный ответ для подробностей, связанных с регистрацией Установить уровни ведения журнала

Дополнительные ресурсы:

http://docs.gunicorn.org/en/stable/design.html

0 голосов
/ 30 ноября 2018

Это моя типичная настройка Flask / Gunicorn.Обратите внимание, что gunicorn запускается через супервизора.

wsgi_web.py.Примечание ProxyFix для получения реального IP-адреса клиента от Nginx.

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)

Фабрика приложений Flask create_app

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

    if logger_override:
        app.logger.handlers = logger_override.handlers
        app.logger.setLevel(logger_override.level)

    # more

    return app

Команда Gunicorn (4-я строка) в супервизоре conf, обратите внимание наВ этом случае для параметра --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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...