Изменение уровней журнала для каждого запроса в Flask - PullRequest
2 голосов
/ 13 мая 2019

У меня есть кодовая база Flask с модулем журналирования стандартной библиотеки. Я хотел бы иметь возможность увеличивать и уменьшать уровень журнала для каждого запроса. Таким образом, я мог получить информацию об уровне трассировки или отладки, записанную только по конкретным запросам, которые меня интересуют в отладке, установив параметр строки запроса или нечто подобное.

Я знаю, что у Flask есть декоратор before_request и after_request, который можно использовать для повышения и понижения уровня лога. Однако было бы плохо, если бы возникло необработанное исключение и помешало сбросу уровня журнала до уровня по умолчанию. Есть ли надежный способ установить и восстановить уровень журнала для каждого запроса?

Я также не очень знаком с тем, как модуль протоколирования взаимодействует с потоками и Flask. Если на моем сервере Flask запущен многопоточный сервер приложений, является ли регистратор общим для всех потоков? Я не хочу понижать уровень журнала в одном запросе, а другой несвязанный запрос выполняется с помощью регистратора первых запросов.

1 Ответ

0 голосов
/ 13 мая 2019

Вы можете использовать регистратор Flask для создания дочернего регистратора:

@app.before_request
def before_request():
    if 'trace' in request.args:
        trace_logger = app.logger.getChild('trace')
        trace_logger.setLevel(logging.DEBUG)
        g._trace_logger = trace_logger

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

Далее напишите вспомогательную функцию:

def trace(*args, **kwargs):
    logger = getattr(g, '_trace_logger', None)
    if logger is not None:
        logger.debug(*args, **kwargs)

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

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