Python에서 루트 로거가 DEBUG 수준으로 설정되어 있는지 확인합니까?


93

다음과 같은 명령 줄 매개 변수를 사용하여 로깅 모듈을 DEBUG로 설정하면 :

if (opt["log"] == "debug"):
  logging.basicConfig(level=logging.DEBUG)

로거가 DEBUG로 설정되었는지 나중에 어떻게 알 수 있습니까? True 플래그가 전달되면 함수의 시간을 측정하는 데코레이터를 작성하고 있으며 플래그가 제공되지 않으면 루트 로거가 DEBUG로 설정 될 때 기본적으로 타이밍 정보를 인쇄합니다.


결국 opt [ "time_functions"] (다른 옵션에 따라 True / False로 기본 설정 될 수 있음)와 같이이를 로거에 연결하는 대신 특정 항목을 사용하려고합니다.

답변:


116
logging.getLogger().getEffectiveLevel()

logging.getLogger() 인수없이 루트 수준 로거를 가져옵니다.

http://docs.python.org/library/logging.html#logging.Logger.getEffectiveLevel


훌륭합니다, 감사합니다! 나는 그런 일을하고 있었지만 (명시적인 "root"를 getLogger에 전달하는 것을 제외하고), 로거가 디버그로 설정되기 전에 데코레이터 의 init 함수 에서 그것을하고 있었다 : \
gct

5
숫자가 아닌 레벨의 이름을 원하면 이것을 사용하여 숫자를 문자열로 변환 할 수 있습니다 (예 : 'INFO') : logging.getLevelName ()
guettli

2
@guettli, getLevelName ()에는 원하는 텍스트 표현의 수준을 포함하는 하나의 인수가 필요합니다. 그래서 호출은 실제로이 짐승입니다 : logging.getLevelName(logging.getLogger().getEffectiveLevel()). 현재 레벨의 문자열 만 원하는 경우 더 간단한 구문을 사용하는 것이 좋습니다.
Trutane 19.01.25

레벨 정수를 이름으로 변환하려면 : docs.python.org/3/library/logging.html#levels
EddyTheB

106

실제로 더 좋은 방법이 있습니다logging.getLogger().isEnabledFor(logging.DEBUG) . 코드를 사용하세요 . 의 결과로 무엇을해야하는지 이해하려고 노력하면서 발견했습니다 getEffectiveLevel().

다음은 로깅 모듈 자체가 사용하는 코드입니다.

def getEffectiveLevel(self):
    """
    Get the effective level for this logger.

    Loop through this logger and its parents in the blogger hierarchy,
    looking for a non-zero logging level. Return the first one found. 
    """
    logger = self
    while logger:
        if logger.level:
            return logger.level
        logger = logger.parent
    return NOTSET

def isEnabledFor(self, level):
    """
    Is this logger enabled for level ‘level’?
    """
    if self.manager.disable >= level:
        return 0
    return level >= self.getEffectiveLevel()

4
이것은 낮은 런타임 복잡성으로 동일한 작업을 수행하기 때문에 허용되는 대답이어야합니다.
AndyJost

1
이미지가 아닌 실제 코드라면. 여전히 : 찬성.
kaiser

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