파이썬 글로벌 로거
이 자습서에서는 로깅, 다양한 수준 및 Python에서의 중요성을 소개합니다. 그런 다음 Python logging
모듈을 전역적으로 사용하는 방법을 알아봅니다.
로깅 소개 및 Python에서의 중요성
로깅은 소프트웨어를 실행하는 동안 발생하는 이벤트를 추적하는 방법입니다. 소프트웨어 개발자는 누군가가 프로그램을 실행할 때 발생하는 오류 및 이벤트를 기록하기 위해 로깅 호출을 추가합니다.
Python 프로그래밍에는 이러한 오류 및 이벤트를 기록할 수 있는 logging
이라는 내장 모듈이 있습니다. 이벤트는 메시지이며 선택적으로 이벤트에 특정한 데이터를 보유할 수 있습니다.
이러한 이벤트는 소프트웨어 개발자가 지정한 다양한 수준/심각도일 수 있습니다. 따라서 로깅은 애플리케이션을 디버그하고 필요한 정보를 추적하는 매우 강력한 도구라고 말할 수 있습니다.
로깅
모듈은 다양한 로그 핸들러를 구성하고, 로그 메시지를 이러한 핸들러로 라우팅하고, 다양한 사용 사례를 처리하는 데 도움이 되는 매우 유연한 구성을 가능하게 하는 다양한 방법을 애플리케이션에 제공합니다.
logging
모듈에는 다양한 심각도 수준을 처리하는 데 도움이 되는 다양한 로그 수준도 있습니다. 다음은 로깅 수준에 대한 간략한 설명입니다.
INFO
- 여러 가지가 예상대로 작동하는지 확인합니다.DEBUG
- 누군가가 문제를 진단할 때 관심 있는 일반적인 자세한 정보를 제공합니다.경고
- 예상치 못한 일이 발생했음을 나타냅니다. 또한WARNING
은 곧 발생할 수 있는 문제(예: 디스크 공간 부족)를 나타냅니다.CRITICAL
- 응용 프로그램 자체를 계속 실행할 수 없는 심각한 오류를 나타냅니다.ERROR
- 프로그램이 작업이나 기능을 수행할 수 없도록 하는 더 심각한 문제를 나타냅니다.
Python에서 전역적으로 logging
모듈 사용
Python에서 logging
모듈을 로컬 및 전역적으로 사용할 수 있습니다. 여기서 로컬이란 특정 범위에서 logging
모듈을 사용하는 것을 의미합니다. 예를 들어 A.py
파일에서 logging
모듈을 가져오므로 B.py
파일이 아닌 A.py
에서만 사용할 수 있습니다.
반면 전역적으로는 A.py
파일과 B.py
파일의 모든 위치에서 사용하는 것을 의미합니다. Python 글로벌 로거를 학습하려면 로컬에서 logging
모듈의 사용을 이해하는 것이 중요합니다.
로컬에서 logging
모듈을 사용하는 예제 코드(test.py
파일에 저장됨):
import logging
logger = logging.getLogger("test_logger")
logger.setLevel(logging.INFO)
def sum_numbers(number1, number2):
try:
output = number1 + number2
except TypeError:
logger.exception("Oh! TypeError Occurred")
else:
return output
result = sum_numbers(10, "Mehvish")
여기에서는 가져온 test.py
파일에서 로컬로 logging
모듈을 사용하고 있습니다.
그런 다음 getLogger()
를 사용하여 Python의 logging
모듈을 사용하여 로깅을 시작합니다. 이를 위해 팩토리 함수 logging.getLogger(name)
가 실행됩니다.
getLogger()
는 로거의 이름인 하나의 인수를 취하고 지정된 경우 이름이 있는 로거 인스턴스(로거의 개체)에 대한 참조를 반환하고 그렇지 않은 경우 루트
를 반환합니다.
정확한 이름으로 getLogger()
를 여러 번 호출하면 동일한 로거 인스턴스에 대한 참조가 반환되므로 전역적으로 사용하는 데 유용합니다(잠시 후에 살펴보겠습니다).
다음으로 setLevel()
메서드를 사용하여 로깅 수준을 설정하고 sum_numbers()
함수를 작성합니다. 이 함수는 두 개의 int
유형 숫자를 가져와 더하고 올바른 값이 제공되면 결과를 반환합니다. 그렇지 않으면 TypeError
를 생성합니다.
마지막으로 sum_numbers()
를 호출하여 다음 결과를 생성하여 logging
모듈이 작동하는지 확인합니다.
출력:
Oh! TypeError Occurred
Traceback (most recent call last):
File "E:\Code\use_logging_locally\test.py", line 8, in sum
output = number1 + number2
TypeError: unsupported operand type(s) for +: 'int' and 'str'
logging
모듈을 사용하는 것은 매우 쉽지만 이 모듈을 전역적으로 활용하는 방법은 무엇입니까? 아래에서 알아보도록 하겠습니다.
예제 코드(log.py
파일에 저장됨):
import logging
def set_custom_logger(name):
formatter = logging.Formatter(
fmt="%(asctime)s - %(levelname)s - %(module)s - %(message)s"
)
handler = logging.StreamHandler()
handler.setFormatter(formatter)
logger = logging.getLogger(name)
logger.setLevel(logging.DEBUG)
logger.addHandler(handler)
return logger
예제 코드(submodule.py
파일에 저장됨):
import logging
logger = logging.getLogger("root")
logger.debug("submodule message")
예제 코드(main.py
파일에 저장됨):
import submodule
import log
logger = log.setup_custom_logger("root")
logger.debug("main message")
출력:
2022-10-27 09:31:02,447 - DEBUG - main - main message
2022-10-27 09:31:02,450 - DEBUG - submodule - submodule message
이 코드 샘플은 날짜, 시간, 로깅 수준, 모듈 이름 및 메시지를 인쇄합니다. log.py
파일에서 사용한 정확한 로거 인스턴스를 사용하기 위해 submodule.py
에서 logging.getLogger()
를 사용했습니다.
어떻게? logging.getLogger(name)
은 일반적으로 Python에서 logging
모듈을 사용하여 로깅을 시작하기 위해 실행됩니다. getLogger()
는 로거의 이름이라는 하나의 인수를 허용합니다.
getLogger()
함수를 사용하여 주어진 이름(제공된 경우) 또는 root
(지정되지 않은 경우)로 로거 인스턴스에 대한 참조를 얻습니다.
정확한 이름을 가진 getLogger()
를 여러 번 호출하면 정확한 로거 개체에 대한 참조가 반환되므로 전역적으로 사용할 수 있습니다.