파이썬 글로벌 로거

Mehvish Ashiq 2023년6월21일
  1. 로깅 소개 및 Python에서의 중요성
  2. Python에서 전역적으로 logging 모듈 사용
파이썬 글로벌 로거

이 자습서에서는 로깅, 다양한 수준 및 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()를 여러 번 호출하면 정확한 로거 개체에 대한 참조가 반환되므로 전역적으로 사용할 수 있습니다.

Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook

관련 문장 - Python Logging