developer tip

로거에 대한 핸들러를 찾을 수 없습니다.

copycodes 2021. 1. 7. 08:09
반응형

로거에 대한 핸들러를 찾을 수 없습니다.


저는 파이썬 초보자입니다. 나는 파이썬에 로그인을 시도하고 있었고 로거 인스턴스를 통해 경고를 인쇄하려고 시도하는 동안 로거 오류에 대한 처리기를 찾을 수 없음을 발견했습니다 . 아래는 내가 시도한 코드입니다.

import logging
logger=logging.getLogger('logger')
logger.warning('The system may break down')

그리고이 오류가 발생 합니다. 로거 "로거"에 대한 처리기를 찾을 수 없습니다.

나를 혼란스럽게하는 것은 처음에를 사용하여 경고를 인쇄하려고 할 때 logging다음을 통해 logger잘 작동한다는 것입니다.

>>> import logging
>>> logging.warning('This is a WARNING!!!!')
WARNING:root:This is a WARNING!!!!
>>> 
>>> logger.warning('WARNING!!!!')
WARNING:logger:WARNING!!!!

누군가 두 번째 시나리오에서 무슨 일이 일어나고 있는지에 대해 약간의 빛을 던질 수 있습니까?


를 통해 일부 메시지를 로깅하려면 loggerPython에서 하나 이상의 핸들러가 logger객체에 추가되어야 합니다. 기본적으로 debug, warn및 기타 기능 logging모듈을 호출 basicConfig차례로을 추가 할 StreamHandler받는 사람 root logger.

모듈에 대해 작성중인 로거 객체에 필요한 핸들러를 추가하는 것이 항상 권장 됩니다.

멋진 튜토리얼 이있는 공식 Python 문서를 참조 하거나 로깅 모듈의 소스 코드를 직접 확인하는 것이 좋습니다.

간단하게 Python 셸 자체에서 소스를 확인할 수 있습니다.

import logging
import inspect
print(inspect.getsource(logging))

마지막으로를 basicConfig명시 적으로 호출 하면 문제가 해결됩니다.

import logging
logging.basicConfig()
logger = logging.getLogger('logger')
logger.warning('The system may break down')

logging.basicConfig () 호출 :

>>> import logging
>>> logging.basicConfig()
>>> logger = logging.getLogger('logger')
>>> logger.warning('The system may break down')
WARNING:logger:The system may break down

phd의 답변 외에도 전화 logging.basicConfig()는 기본 StreamHandlerFormatter. 로깅 기능을 빠르게 갖고 싶다면 충분합니다. basicConfig몇 가지 인수 를 전달하여 동작을 사용자 지정할 수 있습니다 .

유용한 매개 변수 추가 : 메시지와 함께 타임 스탬프 출력

logger = logging.basicConfig(level=logging.DEBUG, 
        format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')

이것은 대부분의 일회성 요구에 적합합니다. 구성에 대한 더 많은 제어가 필요한 경우 로거의 속성을 직접 정의하여보다 정교한 동작을 추가 할 수 있습니다.

정교한 예 : basicConfig기능 을 사용하지 않고

import logging
logger = logging.getLogger("mylogger")
streamHandler = logging.StreamHandler()
streamHandler.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
streamHandler.setFormatter(formatter)

logger.addHandler(streamHandler)

logger.info("Files copied")
logger.warning("disk quota exceeded")
>> 2017-12-06 11:11:12, 090 - mylogger - INFO Files copied
>> 2017-12-06 11:11:12, 091 - mylogger - WARNING disk quota exceeded

더 큰 환경에서 다음 단계는 이전에 만든 로거에서 새 로거를 파생하여 먼저 형식을 유지하고 "로그 계층"을 유지하는 것입니다.

logger2 = logging.getLogger("mylogger.new")
logger2.info("New Logger info")
>> 2017-12-06 11:11:12, 091 - mylogger.new - New logger info

A good reference is the logging cookbook: https://docs.python.org/2/howto/logging-cookbook.html


If you get this error when using sentry (No handlers could be found for logger "sentry.errors"), it could be due to sentry bug for SNI support.

check https://github.com/getsentry/raven-python/issues/523 for more details. a quick workaround is to replace DSN scheme by threaded+requests+https:

RAVEN_CONFIG = {
    'dsn': 'threaded+requests+https://xxxxxxxxxxxx@sentry.example.com/1',
}

ReferenceURL : https://stackoverflow.com/questions/44188270/no-handlers-could-be-found-for-logger

반응형