반응형
로깅
어떤 소프트웨어가 실행될 때 발생하는 이벤트를 추적하는 수단
파이썬에서는 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
반응형
'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 |