IT Share you

Python 로깅-가져온 모듈에서 로깅 비활성화

shareyou 2020. 12. 11. 20:57
반응형

Python 로깅-가져온 모듈에서 로깅 비활성화


Python 로깅 모듈을 사용하고 있으며 가져 오는 타사 모듈에서 인쇄 한 로그 메시지를 비활성화하고 싶습니다. 예를 들어 다음과 같은 것을 사용하고 있습니다.

logger = logging.getLogger()
logger.setLevel(level=logging.DEBUG)
fh = logging.StreamHandler()
fh_formatter = logging.Formatter('%(asctime)s %(levelname)s %(lineno)d:%(filename)s(%(process)d) - %(message)s')
fh.setFormatter(fh_formatter)
logger.addHandler(fh)

이렇게하면 logger.debug ( "my message!")를 수행 할 때 디버그 메시지가 출력되지만 내가 가져온 모듈 (예 : 요청 및 기타 여러 가지)의 디버그 메시지도 출력합니다.

관심있는 모듈의 로그 메시지 만보고 싶습니다. 로깅 모듈이이 작업을 수행하도록 할 수 있습니까?

이상적으로는 로거에게 "ModuleX, ModuleY"의 메시지를 인쇄하고 나머지는 모두 무시하도록 지시 할 수 있기를 바랍니다.

다음을 살펴 보았지만 가져온 함수를 호출 할 때마다 로깅을 비활성화 / 활성화 할 필요가 없습니다. 로깅-가져온 모듈 로그를 무시하는 방법?


문제는 getLogger인수없이 호출 하면 루트 로거가 반환 되므로 레벨을 설정할 때 logging.DEBUG해당 로거를 사용하는 다른 모듈의 레벨도 설정됩니다.

루트 로거를 사용 하지 않음 으로써이 문제를 해결할 수 있습니다 . 이렇게하려면 모듈 이름과 같이 이름을 인수로 전달하면됩니다.

logger = logging.getLogger('my_module_name')
# as before

이렇게하면 새 로거가 생성되므로 실수로 다른 모듈의 로깅 수준을 변경하지 않습니다.


후자는 루트 로거 메서드 를 호출하는 편리한 함수이기 때문에 분명히 logger.debug대신 사용해야 합니다 .logging.debugdebug

이것은 고급 로깅 ​​자습서에 언급되어 있습니다. 또한 간단한 방법으로 어떤 모듈이 로그 메시지를 트리거했는지 알 수 있습니다.


파이썬 logging패키지 를 사용하려는 경우이를 사용하는 모든 모듈에서 로거를 정의하는 것이 일반적인 관례입니다.

logger = logging.getLogger(__name__)

많은 인기있는 파이썬 패키지가이를 수행합니다 requests. 패키지가이 규칙을 사용하는 경우 로거 이름이 패키지와 동일한 이름 (또는 해당 로거의 하위)이되기 때문에 로깅을 활성화 / 비활성화하기가 쉽습니다. 다른 로거와 동일한 파일에 기록 할 수도 있습니다.

logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

requests_logger = logging.getLogger('requests')
requests_logger.setLevel(logging.DEBUG)

handler = logging.StreamHandler()
handler.setLevel(logging.DEBUG)
logger.addHandler(handler)
requests_logger.addHandler(handler)

이것이 게시하기에 적절한 지 확실하지 않지만 오랫동안 갇혀 있었고 다른 곳에서는 찾지 못했기 때문에 동일한 문제를 가진 사람을 돕고 싶었습니다!

로깅 고급 자습서문제 해결 에서 매우 간단한 설명서를 따랐음에도 불구하고 matplotlib에서 디버그 로그를 얻었습니다 . main()한 파일 에서 로거를 시작 하고 다른 파일에서 플롯을 생성하는 함수를 가져 왔습니다 (matplotlib를 가져온 위치).

나를 위해 일한 것은 내 주 파일의 다른 모듈에서와 마찬가지로 matplotlib 가져 오기 전에 수준을 설정하는 것이 었습니다. 이것은 나에게 반 직관적 인 것처럼 보였으므로 아직 가져 오지 않은 로거에 대한 구성을 설정할 수있는 방법에 대한 통찰력이있는 사람이 있다면 이것이 어떻게 작동하는지 궁금 할 것입니다. 감사!

내 주 파일에서 :

import logging
import requests
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
logging.getLogger('requests').setLevel(logging.DEBUG)

def main():
  ...

plot.py파일에서 :

import logging
logging.getLogger('matplotlib').setLevel(logging.WARNING)
import matplotlib.pyplot as plt

def generatePlot():
  ...

@Bakuriu quite elegantly explains the function. Conversely, you can use the getLogger() method to retrieve and reconfigure/disable the unwanted loggers.

I also wanted to add the logging.fileConfig() method accepts a parameter called disable_existing_loggers which will disable any loggers previously defined (i.e., in imported modules).


This disables all existing loggers, such as those created by imported modules, while still using the root logger (and without having to load an external file).

logging.config.dictConfig({
    'version': 1,
    'disable_existing_loggers': True,
})

Note that you need to import all modules you don't want logged first! Otherwise those won't be considered as "existing loggers". It will then disable all loggers from those modules. This might lead you to also miss out on important errors!

For more detailed examples using related options for configuration, see https://gist.github.com/st4lk/6287746, and here is a (partially working) example using YAML for config with the coloredlog library.


You could use something like:

logging.getLogger("imported_module").setLevel(logging.WARNING)
logging.getLogger("my_own_logger_name").setLevel(logging.DEBUG)

This will set my own module's log level to DEBUG, while preventing the imported module from using the same level.

Note: "imported_module" can be replaced with imported_module.__name__ (without quotes), and "my_own_logger_name" can be replaced by __name__ if that's the way you prefer to do it.

참고URL : https://stackoverflow.com/questions/35325042/python-logging-disable-logging-from-imported-modules

반응형