Python의 파일 및 콘솔에 메시지 기록

Subodh Adhikari 2023년10월10일
  1. logging 모듈을 사용하여 Python의 파일 및 콘솔에 로그 메시지 인쇄
  2. logging 모듈을 사용하여 Python에서 콘솔에 로그 메시지 인쇄
  3. logging 모듈을 사용하여 Python의 파일에 로그 메시지 인쇄
Python의 파일 및 콘솔에 메시지 기록

이 자습서에서는 디버그 문자열을 Python의 파일 및 콘솔에 기록하는 몇 가지 방법을 소개합니다.

logging 모듈을 사용하여 Python의 파일 및 콘솔에 로그 메시지 인쇄

로깅은 시스템에서 발생하는 다양한 이벤트의 기록을 유지하는 프로세스입니다. 이러한 이벤트는 입력 데이터, 프로세스, 스레드, 출력 데이터, 처리된 정보, 오류, 경고, 알림일 수 있습니다. 다양한 이벤트가 추적되어 로그 파일에 저장됩니다. logging 모듈은 프로그래머가 발생한 다양한 이벤트를 기록할 수 있도록 Python에서 제공합니다. 모듈에는 특정 클래스와 메서드가 있습니다. Loggers, Handlers, FiltersFormatterslogging 모듈이 정의하는 기본 클래스입니다.

basicConfig() 메소드는 기본 구성을 수행합니다. 기본 Formatter를 사용하여 StreamHandler를 생성합니다. 그런 다음 루트 로거에 추가합니다. 로깅 수준은 숫자 값으로 표시됩니다. 6가지 로깅 수준이 있습니다: CRITICAL, ERROR, WARNING, INFO, DEBUGNOTSET. 아래에서 로깅 수준을 INFO로 설정했습니다. 따라서 INFO, WARNING, ERRORCRITICAL이 표시되거나 저장됩니다.

콘솔과 파일에 쓰기 위해 우리는 logging.basicConfig()를 사용할 것입니다. 이는 인수 핸들러를 사용하고 특히 동일한 포맷터로 여러 핸들러를 설정할 때 로깅 설정을 단순화할 수 있습니다. FileHandler() 메소드를 사용하여 파일에 쓰고 debug.log를 사용하여 모든 정보를 기록합니다. 마찬가지로 콘솔에 쓰기 위해 StreamHandler()를 사용합니다. 기본적으로 StreamHandler()는 stderr에 씁니다. stdout에 쓰기 위해 sys 모듈을 가져오고 sys.stdout을 명시적으로 StreamHandler()에 전달합니다.

아래 예에서 로그는 콘솔과 debug.log 파일에 인쇄됩니다.

# python 3.x
import logging
import sys

logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s [%(levelname)s] %(message)s",
    handlers=[logging.FileHandler("debug.log"), logging.StreamHandler(sys.stdout)],
)
logging.debug("This message is skipped as a level is set as INFO")
logging.info("So should this")
logging.warning("And this, too")
logging.error("Testing non-ASCII character, Ø and ö")

출력:

2021-07-28 14:50:01,348 [INFO] So should this
2021-07-28 14:50:01,349 [WARNING] And this, too
2021-07-28 14:50:01,349 [ERROR] Testing non-ASCII character, Ø and ö

logging 모듈을 사용하여 Python에서 콘솔에 로그 메시지 인쇄

로깅을 사용하고 기본 구성을 설정하려면 logging.basicConfig()를 사용합니다. 그런 다음 print() 대신 logging.{level}(message)을 호출하여 콘솔에 메시지를 표시합니다. basicConfig() 설정에서 레벨을 INFO로 구성했기 때문에 프로그램 후반부에 logging.info()를 호출했습니다. 그리고 문자열의 전체 메시지는 logging.info()로 전달되어 콘솔에 표시됩니다.

예제 코드:

# python 3.x
import logging

logging.basicConfig(level=logging.INFO)


def area(l, b):
    """Compute the area of a rectangle"""
    return l * b


logging.info(
    "Area of length: {l} and breadth: {b} is {c}".format(l=3, b=4, c=area(l=3, b=4))
)

출력:

INFO:root:Area of length: 3 and breadth: 4 is 12

logging 모듈을 사용하여 Python의 파일에 로그 메시지 인쇄

프로그램에서 여러 모듈을 사용하는 경우 루트 모듈을 사용하는 데는 심각한 제한이 있습니다. 이것이 logger.getLogger(name) 메소드를 사용하여 새 로거를 생성해야 하는 이유입니다.

__name__ 변수를 로거 이름으로 사용하는 규칙이 있습니다. 새 로거를 생성했으면 루트의 logging.info() 메서드 대신 새 logger.info()를 사용하여 모든 메시지를 기록해야 합니다. FileHandler()는 사용자 정의 로거가 다른 파일에 로그인하도록 하는 데 사용됩니다. 여기에서 우리는 logfile.log에 정보를 기록했습니다. 마찬가지로 Formatter()는 기록된 메시지의 형식을 변경하는 데 사용됩니다. 그리고 Formatter는 로거에 직접 설정되지 않고 FileHandler 개체에 설정됩니다.

예를 들어 getLogger()를 사용하여 로거를 생성하거나 가져옵니다. 그런 다음 setLogger() 메서드를 사용하여 로그 수준을 설정합니다. 레벨을 logging.WARNING으로 설정하십시오. 다음으로 FileHandler() 메소드를 사용하여 핸들러를 정의하고 Formatter() 메소드를 사용하여 포맷터를 설정합니다. 그런 다음 addHandler() 메서드를 사용하여 로거에 핸들러를 추가합니다. 마지막으로 테스트할 몇 가지 메시지를 작성합니다. log_file.log 파일에서 로그를 볼 수 있습니다.

예제 코드:

# python 3.x
import logging

logger = logging.getLogger(__name__)
logger.setLevel(logging.WARNING)
handler = logging.FileHandler("log_file.log")
formatter = logging.Formatter(
    "%(asctime)s : %(name)s  : %(funcName)s : %(levelname)s : %(message)s"
)
handler.setFormatter(formatter)
logger.addHandler(handler)

logger.debug("A debug message")
logger.info("An info message")
logger.warning("There is something wrong")
logger.error("An error has happened.")
logger.critical("Fatal error occured. Cannot continue")

출력:

2021-07-30 11:55:31,047 : __main__  : <module> : WARNING : There is something wrong
2021-07-30 11:55:31,047 : __main__  : <module> : ERROR : An error has happened.
2021-07-30 11:55:31,047 : __main__  : <module> : CRITICAL : Fatal error occured. Cannot continue

관련 문장 - Python Logging