programing

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

copysource 2023. 1. 24. 10:07
반응형

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

기본적으로 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)

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

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)

코멘트내의 유저 136036 에 의하면, 이 메서드는, 상기의 스니펫을 실행했을 때에 존재하는 로거만을 표시하는 것에 주의해 주세요.예를 들어 클래스를 인스턴스화할 때 모듈이 새 로거를 만드는 경우 이름을 인쇄하려면 클래스 작성 후 이 스니펫을 넣어야 합니다.

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

이렇게 레벨의 모든 메시지=urlib3의 정보는 로그 파일에 없습니다.

레벨은 계속 사용할 수 있습니다=로그 메시지에 대한 정보...사용 중인 라이브러리에 맞게 수정하십시오.

사용하시는 분logging.config.dictConfig사전의 요청 라이브러리 로그 수준을 다음과 같이 변경할 수 있습니다.

'loggers': {
    '': {
        'handlers': ['file'],
        'level': level,
        'propagate': False
    },
    'requests.packages.urllib3': {
        'handlers': ['file'],
        'level': logging.WARNING
    }
}
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

귀하와 유사한 문제가 발생한 후 약 1~2주 전에 작성한 문서 섹션을 복사하여 붙여넣겠습니다.

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

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

컨피규레이션파일이 있는 경우는,

로거 섹션에 urlib3를 추가합니다.

[loggers]
keys = root, urllib3

logger_urlib3 섹션을 추가합니다.

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

정답은 다음과 같습니다.Python:서드파티 라이브러리의 로깅 스테이트먼트를 억제하는 방법

basic Config 기본 로깅레벨을 그대로 두고 모듈의 로거를 취득했을 때 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")

어떤 로거가 로그 메시지를 생성하는지 알아내는 데 Kbrose의 지침은 매우 유용했습니다. 프로젝트를. 의 벌목꾼이라는 을 알 수 있었습니다.elasticsearch파이썬대부분의 질문의 지침에 따라 로거에 다음을 추가하여 비활성화했습니다.

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

Elastic Search 쿼리를 실행할 때마다 다른 사용자가 도움이 되지 않는 로그 메시지를 볼 경우에 대비하여 여기에 게시합니다.

이전 접근 방식이 작동을 중지했는지 알 수 없지만, 어떤 경우에도 경고를 제거할 수 있는 다른 방법이 있습니다.

PYTHONWARNINGS="ignore:Unverified HTTPS request" ./do-insecure-request.py

기본적으로 스크립트 실행 컨텍스트에서 환경 변수를 추가합니다.

자료: https://urllib3.readthedocs.org/en/latest/security.html#disabling-warnings

그냥 됩니다: 더하면 됩니다.requests.packages.urllib3.disable_warnings() 후에import requests

언급URL : https://stackoverflow.com/questions/11029717/how-do-i-disable-log-messages-from-the-requests-library

반응형