[python] 요청 라이브러리에서 로그 메시지를 비활성화하려면 어떻게합니까?

기본적으로 Requests python 라이브러리는 다음 행을 따라 콘솔에 로그 메시지를 작성합니다.

Starting new HTTP connection (1): example.com
http://example.com:80 "GET / HTTP/1.1" 200 606

일반적으로이 메시지에 관심이 없으며 사용하지 않으려 고합니다. 해당 메시지를 무음으로 만들거나 요청의 세부 정보를 줄이는 가장 좋은 방법은 무엇입니까?



답변

요청 의 로깅 수준 을 구성하는 방법을 찾았습니다 . 표준 로깅 모듈을 통해 수행됩니다 . 적어도 경고가 아닌 한 메시지를 로그하지 않도록 구성하기로 결정했습니다.

import logging

logging.getLogger("requests").setLevel(logging.WARNING)

urllib3 라이브러리 (일반적으로 요청에 의해 사용됨)에도이 설정을 적용하려면 다음을 추가하십시오.

logging.getLogger("urllib3").setLevel(logging.WARNING)


답변

(깊게 중첩 된) 모듈의 로깅을 수정하는 방법을 찾고자한다면 logging.Logger.manager.loggerDict모든 로거 객체의 사전을 얻는 데 사용 하십시오. 리턴 된 이름은 다음에 대한 인수로 사용될 수 있습니다 logging.getLogger.

import requests
import logging
for key in logging.Logger.manager.loggerDict:
    print(key)
# requests.packages.urllib3.connectionpool
# requests.packages.urllib3.util
# requests.packages
# requests.packages.urllib3
# requests.packages.urllib3.util.retry
# PYREADLINE
# requests
# requests.packages.urllib3.poolmanager

logging.getLogger('requests').setLevel(logging.CRITICAL)
# Could also use the dictionary directly:
# logging.Logger.manager.loggerDict['requests'].setLevel(logging.CRITICAL)

주석의 user136036에 따라이 메소드는 위의 스 니펫을 실행할 때 존재하는 로거 만 표시합니다. 예를 들어, 클래스를 인스턴스화 할 때 모듈이 새 로거를 작성하는 경우 클래스를 작성한 이름을 인쇄하려면 이 스 니펫 넣어야합니다 .


답변

import logging
urllib3_logger = logging.getLogger('urllib3')
urllib3_logger.setLevel(logging.CRITICAL)

이런 식으로 urllib3의 level = INFO 메시지가 로그 파일에 표시되지 않습니다.

따라서 로그 메시지에 대해 level = INFO를 계속 사용할 수 있습니다. 사용중인 라이브러리에 대해이를 수정하십시오.


답변

내가 당신과 비슷한 문제를 겪은 후, 내가 일주일 또는 이틀 전에 쓴 문서 섹션을 복사 / 붙여 보겠습니다.

import requests
import logging

# these two lines enable debugging at httplib level (requests->urllib3->httplib)
# you will see the REQUEST, including HEADERS and DATA, and RESPONSE with HEADERS but without DATA.
# the only thing missing will be the response.body which is not logged.
import httplib
httplib.HTTPConnection.debuglevel = 1

logging.basicConfig() # you need to initialize logging, otherwise you will not see anything from requests
logging.getLogger().setLevel(logging.DEBUG)
requests_log = logging.getLogger("requests.packages.urllib3")
requests_log.setLevel(logging.DEBUG)
requests_log.propagate = True

requests.get('http://httpbin.org/headers')


답변

누구든지 logging.config.dictConfig다음과 같이 사전에서 요청 라이브러리 로그 레벨을 변경할 수 있습니다.

'loggers': {
    '': {
        'handlers': ['file'],
        'level': level,
        'propagate': False
    },
    'requests.packages.urllib3': {
        'handlers': ['file'],
        'level': logging.WARNING
    }
}


답변

로거 이름을 설정 requests하거나 requests.urllib3작동하지 않았습니다. 로깅 레벨을 변경하려면 정확한 로거 이름을 지정해야합니다.

먼저 어떤 로거를 정의했는지 확인하고 제거하려는 로거를 확인하십시오.

print(logging.Logger.manager.loggerDict)

그리고 당신은 다음과 같은 것을 보게 될 것입니다 :

{...'urllib3.poolmanager': <logging.Logger object at 0x1070a6e10>, 'django.request': <logging.Logger object at 0x106d61290>, 'django.template': <logging.Logger object at 0x10630dcd0>, 'django.server': <logging.Logger object at 0x106dd6a50>, 'urllib3.connection': <logging.Logger object at 0x10710a350>,'urllib3.connectionpool': <logging.Logger object at 0x106e09690> ...}

그런 다음 정확한 로거 레벨을 구성하십시오.

   'loggers': {
    '': {
        'handlers': ['default'],
        'level': 'DEBUG',
        'propagate': True
    },
    'urllib3.connectionpool': {
        'handlers': ['default'],
        'level': 'WARNING',
        'propagate' : False
    },


답변

구성 파일이 있으면 구성 할 수 있습니다.

로거 섹션에 urllib3을 추가하십시오.

[loggers]
keys = root, urllib3

logger_urllib3 섹션을 추가하십시오.

[logger_urllib3]
level = WARNING
handlers =
qualname = requests.packages.urllib3.connectionpool