Установить уровень журнала для определенных запросов. Сессия - PullRequest
0 голосов
/ 14 апреля 2020

Я могу установить уровень регистрации для всего, что приходит из пакета запросов, обычным способом:

logging.getLogger('requests').setLevel(...)

Но у меня есть requests.Session, который особенно болтлив, и я хотите установить уровень журнала отдельно для запросов, исходящих из этого сеанса. Следующий пример кода показывает, что я хотел бы сделать (строка отмечена XX).

import requests
import logging

requests.get('https://example.com/').close()
# log output:
# 2020-04-13 19:01:44 [DEBUG] Starting new HTTPS connection (1): example.com:443
# 2020-04-13 19:01:44 [DEBUG] https://example.com:443 "GET / HTTP/1.1" 200 648


s = requests.Session()
s.logger.setLevel(logging.INFO) # XX this doesn't exist, but illustrates what I want to do
s.get('https://example.com/').close() # nothing should be logged

1 Ответ

0 голосов
/ 14 апреля 2020

Вы можете установить декоратор для requests и urllib3 (используется запросами), чтобы дополнительно предоставить вам желаемый уровень ведения журнала только для определенных c функций.

Это будет выглядеть так :

import logging
import requests
import functools

logging.basicConfig()

requests_logger = logging.getLogger("requests")
requests_logger_level = requests_logger.getEffectiveLevel()
urllib3_logger = logging.getLogger("urllib3")
urllib3_logger_level = requests_logger.getEffectiveLevel()

url = 'https://pypi.org/pypi/requests/json'


def requests_debug(f):
    @functools.wraps(f)
    def func(*args, **kwargs):
        try:
            requests_logger.setLevel(logging.DEBUG)
            urllib3_logger.setLevel(logging.DEBUG)
            return f(*args, **kwargs)
        finally:
            requests_logger.setLevel(requests_logger_level)
            urllib3_logger.setLevel(urllib3_logger_level)
    return func


@requests_debug
def get_data():
    r = requests.get(url)
    return r.json()['info']['author']


if __name__ == '__main__':
    a = get_data()
    print(a)
...