본문 바로가기
Python

파이썬 로깅 사용하기

by holy season 2023. 8. 26.
반응형

로깅

어떤 소프트웨어가 실행될 때 발생하는 이벤트를 추적하는 수단

파이썬에서는 logging 모듈을 불러와 함수를 사용해 간단하게 로깅을 사용할 수 있다.

심각도에 따라 로깅 구분하기

수준 사용할 때
DEBUG 상세한 정보. 보통 문제를 진단할 때 사용
INFO 예상대로 작동하는지 확인
WARNING 예상치 못한 일이 발생했거나 가까운 미래에 발생할 문제 표시
소프트웨어는 여전히  작동
ERROR 소프트웨어가 일부 기능을 수행하지 못함 표시
CRITICAL 심각한 에러

심각도에 따라 메시지를 보여주는 코드

심각도에 따라 메시지를 보여주는 코드를 작성해 보았다.

import logging

logger = logging.getLogger(__name__)
logger.debug("DEBUG")
logger.info("INFO")
logger.warning("WARNING")
logger.error("ERROR")
logger.critical("CRITICAL")

결과

DEBUG, INFO 가 출력이 안되는 이유

심각도에 따라 메시지를 보여주는 코드를 작성했는데 DEBUG와 INFO가 출력이 되지 않았다.

그 이유는 logging의 기본 수준이 warning이어서 warning이상의 수준만 출력되기 때문이다.

심각도 수준 설정하기

logging 모듈의 심각도를 설정하기 위해서는 Logger 객체의 setLevel을 설정하고 메시지를 처리할 handler 객체를 생성해야 한다.

심각도 설정 및 핸들러 설정 코드

생성한 logger의 심각도를 DEBUG 수준으로 설정하였고 handler는 TERMINAL에 결과를 보여주는 StreamHandler를 사용하였다.

import logging

# 로거 생성
logger = logging.getLogger(__name__)
# 심각도 설정
logger.setLevel(logging.DEBUG)

# 핸들러 생성
handler = logging.StreamHandler()
logger.addHandler(handler)

# 로깅 메시지 출력
logger.debug("DEBUG")
logger.info("INFO")
logger.warning("WARNING")
logger.error("ERROR")
logger.critical("CRITICAL")

결과

심각도 수준을 설정하는 다른 방법

logging 모듈의 basicConfig() 메서드를 사용해서 심각도 수준을 변경 할 수도 있다.

basicConfig 메서드를 사용해 심각도 수준을 설정하는 코드

logging 모듈의 basicConfig 메서드를 사용해 로깅의 심각도 수준을 설정하는 코드를 작성해 보았다.

import logging

# 심각도 수준 설정
logging.basicConfig(level=logging.DEBUG)

# 로거 생성
logger = logging.getLogger(__name__)

# 로깅 메시지 출력
logger.debug("DEBUG")
logger.info("INFO")
logger.warning("WARNING")
logger.error("ERROR")
logger.critical("CRITICAL")

결과

메시지 출력 형식 변경하기

logging 모듈은 formatter를 만들고 handler에 추가해서 로그 메시지의 구조 및 내용을 변경할 수 있다.

formatter를 사용해 로그 메시지를 변경한 코드

로그 메시지의 형태를 [날짜] : 로그 메시지로 변경하는 formatter를 생성하고 handler 객체의 formatter로 설정하였다.

import logging

# 로거 생성
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

# 포매터 설정
formatter = logging.Formatter(
    fmt="[%(asctime)s] : %(message)s", datefmt="%Y-%m-%d %H:%M:%S"
)

# 스트림 핸들러 생성
handler = logging.StreamHandler()
handler.setFormatter(formatter)

# 로거에 핸들러 추가
logger.addHandler(handler)

# 로깅 메시지 출력
logger.debug("DEBUG")
logger.info("INFO")
logger.warning("WARNING")
logger.error("ERROR")
logger.critical("CRITICAL")

결과

basicConfig를 사용한 포맷 설정

basicConfig를 사용해 메시지 형태 변경한 코드

# 심각도 수준 설정 및 포맷 설정
logging.basicConfig(
    format="[%(asctime)s] : %(message)s",
    datefmt="%Y-%m-%d %H:%M:%S",
    level=logging.DEBUG,
)

# 로거 생성
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

# 로깅 메시지 출력
logger.debug("DEBUG")
logger.info("INFO")
logger.warning("WARNING")
logger.error("ERROR")
logger.critical("CRITICAL")

결과

메시지 출력 형식의 사용되는 어트리뷰트

formatter에는 이런 LogRecord 어트리뷰트가 사용되어질 수 있다.

어트리뷰트 이름 포맷 설명
args
직접 포맷할 필요는 없습니다. message 를 생성하기 위해 msg 에 병합되는 인자의 튜플. 또는 (인자가 하나뿐이고 딕셔너리일 때) 병합을 위해 값이 사용되는 딕셔너리.
asctime %(asctime)s 사람이 읽을 수 있는, LogRecord 가 생성된 시간. 기본적으로 ‘2003-07-08 16:49:45,896’ 형식입니다 (쉼표 뒤의 숫자는 밀리 초 부분입니다).
created %(created)f LogRecord 가 생성된 시간 (time.time() 이 반환하는 시간).
exc_info 직접 포맷할 필요는 없습니다. 예외 튜플 (sys.exc_info 에서 제공) 또는, 예외가 발생하지 않았다면, None.
filename %(filename)s pathname 의 파일명 부분.
funcName %(funcName)s 로깅 호출을 포함하는 함수의 이름.
levelname %(levelname)s 메시지의 텍스트 로깅 수준 ('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL').
levelno %(levelno)s 메시지의 숫자 로깅 수준 (DEBUG, INFO, WARNING, ERROR, CRITICAL).
lineno %(lineno)d 로깅 호출이 일어난 소스 행 번호 (사용 가능한 경우).
message %(message)s 로그 된 메시지. msg % args 로 계산됩니다. Formatter.format() 이 호출 될 때 설정됩니다.
module %(module)s 모듈 (filename 의 이름 부분).
msecs %(msecs)d LogRecord 가 생성된 시간의 밀리 초 부분.
msg 직접 포맷할 필요는 없습니다. 원래 로깅 호출에서 전달된 포맷 문자열. args 와 병합하여 message 를 만듭니다. 또는 임의의 객체 (임의의 객체를 메시지로 사용하기 를 보세요).
name %(name)s 로깅 호출에 사용된 로거의 이름.
pathname %(pathname)s 로깅 호출이 일어난 소스 파일의 전체 경로명 (사용 가능한 경우).
process %(process)d 프로세스 ID (사용 가능한 경우).
processName %(processName)s 프로세스 이름 (사용 가능한 경우).
relativeCreated %(relativeCreated)d logging 모듈이 로드된 시간을 기준으로 LogRecord가 생성된 시간 (밀리 초).
stack_info 직접 포맷할 필요는 없습니다. 현재 스레드의 스택 바닥에서 이 레코드를 생성한 로깅 호출의 스택 프레임까지의 스택 프레임 정보 (사용 가능한 경우).
thread %(thread)d 스레드 ID (사용 가능한 경우).
threadName %(threadName)s 스레드 이름 (사용 가능한 경우).

https://docs.python.org/ko/3.7/library/logging.html#logrecord-attributes

 

logging — 파이썬 로깅 시설 — Python 3.7.17 문서

logging — 파이썬 로깅 시설 소스 코드: Lib/logging/__init__.py 이 모듈은 응용 프로그램과 라이브러리를 위한 유연한 이벤트 로깅 시스템을 구현하는 함수와 클래스를 정의합니다. 표준 라이브러리

docs.python.org

 

반응형

'Python' 카테고리의 다른 글

kt 지니 Voice 사용해보기  (0) 2023.10.10
랜덤 문자열 만들기  (0) 2023.08.30
openCV를 이용한 PySide 영상 출력  (0) 2023.08.16
Pyinstaller ffmpeg 포함 시키기  (0) 2023.08.12
아나콘다(Anaconda)  (0) 2023.08.09