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


367

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

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

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


답변:


573

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

import logging

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

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

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

4
나도 같은 문제를 pysimplesoap
겪고 있으며이

2
이 같은 두 줄을 결합 할 수 있습니다 : logging.getLogger를 ( '요청') setLevel (logging.WARNING).
jpoppe

7
요청 로그 메시지를 억제하기 위해 "urllib3"로거에이 행을 추가해야했습니다.
dgassaway

9
로깅을 가져와야했습니다. logging.getLogger ( "urllib3"). setLevel (logging.WARNING)도 마찬가지입니다. "요청"에 대한 로거는 이러한 메시지를 막지 않습니다.
m_messiah

4
python3에서 요청 라이브러리를 사용할 때 어떤 이유로 getLogger("urllib3")메시지를 억제해야합니다.
robru

104

(깊게 중첩 된) 모듈의 로깅을 수정하는 방법을 찾고자한다면 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에 따라이 메소드는 위의 스 니펫을 실행할 때 존재하는 로거 만 표시합니다. 예를 들어, 클래스를 인스턴스화 할 때 모듈이 새 로거를 작성하는 경우 클래스를 작성한 이름을 인쇄하려면 이 스 니펫 넣어야합니다 .


3
감사합니다 . urllib3사용하면 로그 메시지를 무음으로 만드는 데 도움이되었습니다 boto3. 이러한 경우 로거는입니다 botocore.vendored.requests.packages.urllib3. 그래서 나는 이것을 사용했습니다 : logging.getLogger("botocore.vendored.requests.packages.urllib3").setLevel(logging.WARNING)마침내 메시지를 제거했습니다.
밥 Dem

많은 감사합니다! 인쇄 기준을 변경하면 python-elasticsearch가 필자의 주범이라는 사실을 알 수있었습니다.
Robert Townley

2
모듈 APScheduler이 호출 할 때 와 같이 나중에 호출 할 클래스 내에 로거를 작성할 때이 기능이 작동 하지 않습니다 BackgroundScheduler.BackgroundScheduler().
user136036

@ user136036 : 로거 객체는 싱글 톤이므로 사용자 또는 라이브러리가 먼저 생성하는지 여부는 중요하지 않습니다. 라이브러리가 사용하는 것과 정확히 동일한 이름을 사용 하면 작동 합니다.
Martijn Pieters

1
도서관이 로거를 작성하기 전에 로거를 나열하면 나열되지 않습니다. 어느 것이 맞습니까?
kbrose 2018

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

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

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


4
setLevel(logging.WARNING)가능한 경고 및 오류 메시지도 기록 하는 데 사용 하는 것이 좋습니다 .
razz0

14

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

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')

실용적인 POV의 단순한 '요청'보다 더 구체적인 점은 무엇입니까?
aknuds1

그러나 요청 라이브러리의 로깅에 영향을 줄 것을 고려할 때 logging.getLogger ( "requests") 대신 logging.getLogger ( "requests.packages.urllib3")를 호출하면 무엇을 얻을 수 있습니까?
aknuds1 1

requests.packages.urllib3에서 로깅을 활성화 하시겠습니까? 그렇다면 잘못된 질문에 대한 답변입니다.
aknuds1 1

@ aknuds1 당신이 그들을 비활성화하거나 활성화하려는 경우, 당신에게 달려 있습니다, 나는 이것을 완전히 제어하는 ​​코드 만 넣습니다 :)
sorin

3
질문의 범위를 잘못 이해했다고 생각합니다.
aknuds1 2018 년

14

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

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

@SebastianWagner Django는 dictConfig후드 아래에서 사용 합니다.
uhbif19

정말 고맙습니다! 이것은 꽤 좋습니다. 모든 도서관 로그를 관리 할 수있는 한 곳 !! :)
MehmedB

5

로거 이름을 설정 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
    },

이 레벨은 어디에 설정되어 있습니까?
javadba

base.py의 Django 설정에 있습니다. 그것들을 놓을 위치는 프로젝트 설정에 달려 있습니다.
미코

2

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

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

[loggers]
keys = root, urllib3

logger_urllib3 섹션을 추가하십시오.

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

이것은 구성 파일을 사용하는 사람들에게 완벽하게 유효한 답변입니다. 왜 그렇게 많은 투표권을 얻었는지 모르겠습니까?
패트릭

1

이 답변은 여기에 있습니다 : Python : 타사 라이브러리의 로깅 문을 억제하는 방법?

basicConfig에 대한 기본 로깅 레벨을 그대로두고 모듈의 로거를 가져올 때 DEBUG 레벨을 설정할 수 있습니다.

logging.basicConfig(format='%(asctime)s %(module)s %(filename)s:%(lineno)s - %(message)s')
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

logger.debug("my debug message")

1
import logging

# Only show warnings
logging.getLogger("urllib3").setLevel(logging.WARNING)

# Disable all child loggers of urllib3, e.g. urllib3.connectionpool
logging.getLogger("urllib3").propagate = False

0

로그 메시지를 생성 한 로거를 찾는 Kbrose의 지침은 매우 유용했습니다. Django 프로젝트의 경우 120 개의 다른 로거를 정렬해야했습니다. elasticsearch파이썬 라이브러리가 문제가되는 것을 알았 습니다. 대부분의 질문에 대한 지침에 따라 로거에 이것을 추가하여 비활성화했습니다.

      ...
      'elasticsearch': {
          'handlers': ['console'],
          'level': logging.WARNING,
      },     
      ...

다른 사람이 Elasticsearch 쿼리를 실행할 때마다 도움이되지 않는 로그 메시지가 표시되는 경우 여기에 게시하십시오.


-1

간단한 : 방금 추가 requests.packages.urllib3.disable_warnings()한 후import requests


2
내 버전에서이 방법을 찾지 못했습니다. 성가신 메시지가 수평이기 때문에 경고를 비활성화하는 것은 과도합니다 INFO.
tripleee

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.