아래 문서를 참조하여 작성하였습니다.
전체 코드는 다음 링크를 참조해주세요
로깅이 뭔데?
코드를 작성하다보면, 현재 특정 변수의 값이 잘 들어갔는지 확인해보거나, 오류가 발생하면 오류에 관련된 메시지를 출력하는 작업을 의미한다.
그래서 왜 쓰는데?
Q : 그냥 print() 쓰면 되는거 아닌가?
A : 로깅을 사용하게 되면 로그의 중요도에 따라 필터링 하여 확인할 수 있으며, 콘솔 출력 뿐만 아니라 파일로도 저장하여 추후 조회가 가능하다.
Q : 나는 그냥 단순 출력만 쓰고 싶은데?
A : 단순 콘솔 출력을 위한 것이라면 print()가 해당 작업을 위한 최상의 도구가 될 수 있다.
로깅의 수준
로깅의 수준은 다음과 같이 5단계로 나뉜다.
수준 | 사용할 때 |
---|---|
DEBUG | 상세한 정보. 보통 문제를 진단할 때만 필요하다. |
INFO | 예상대로 작동하는지에 대한 확인 |
WARNING | 예상치 못한 일이 발생했거나 가까운 미래에 발생할 문제에 대한 표시 |
ERROR | 더욱 심각한 문제로 인해. 소프트웨어가 일부 기능을 수행하지 못했습니다. |
CRITICAL | 심각한 에러. 프로그램 자체가 계속 실행되지 않을 수 있음을 나타냅니다. |
기본 수준은 WARNING
이다.
기본 수준 이하는 따로 설정하지 않는 이상 이 수준 이상의 수준만 추적된다.
예시
로그를 콘솔에 출력하는 코드
import logging
logging.debug('This is DEBUG log')
logging.info('This is INFO log')
logging.warning('This is WARNING log')
logging.error('This is ERROR log')
logging.critical('This is CRITICAL log')
출력 결과
WARNING:root:This is WARNING log
ERROR:root:This is ERROR log
CRITICAL:root:This is CRITICAL log
기본 수준이 WARNING
이므로 이 이상 수준의 로그만 추적이 되는 것을 볼 수 있다.
DEBUG, INFO 도 출력하고싶다!
로그의 기본 수준을 변경해주면 DEBUG
, INFO
둘 다 출력이 가능하다.
아래 코드는 기본 수준을 DEBUG
로 설정하여 출력하는 코드이다.
logging.basicConfig(level=logging.DEBUG)
logging.debug('This is DEBUG log')
logging.info('This is INFO log')
logging.warning('This is WARNING log')
logging.error('This is ERROR log')
logging.critical('This is CRITICAL log')
결과
DEBUG:root:This is DEBUG log
INFO:root:This is INFO log
WARNING:root:This is WARNING log
ERROR:root:This is ERROR log
CRITICAL:root:This is CRITICAL log
DEBUG
, INFO
둘 다 잘 출력된 것을 확인할 수 있다.
파일에 로깅하기
logging에서 baseConfig
를 수정함으로써 파일에 로깅이 가능하다.
logging.basicConfig(filename='example.log', level=logging.DEBUG)
logging.debug('파일에 저장될 DEBUG 수준 로깅')
logging.info('파일에 저장될 INFO 수준 로깅')
logging.warning('파일에 저장될 WARNING 수준 로깅')
logging.error('파일에 저장될 ERROR 수준 로깅')
logging.critical('파일에 저장될 CRITICAL 수준 로깅')
해당 python 파일이 있는 폴더에 example.log
가 생긴다.
이를 확인해보자
DEBUG:root:파일에 저장될 DEBUG 수준 로깅
INFO:root:파일에 저장될 INFO 수준 로깅
WARNING:root:파일에 저장될 WARNING 수준 로깅
ERROR:root:파일에 저장될 ERROR 수준 로깅
CRITICAL:root:파일에 저장될 CRITICAL 수준 로깅
다음과 같이 DEBUG
수준부터 로깅이 적용된 것을 볼 수 있다.
메시지 포맷 변경하기
나는 해당 로그가 출력된 시간하고, 어느 모듈의, 어느 메소드에서 출력된건지 알고싶어!
프로젝트 단위로 로그 출력 형식을 통일해야 할 때 포맷을 정리하면 간편하게 로깅을 할 수 있다.
Attribute Name | Format | Statement |
---|---|---|
asctime | %(asctime)s | LogRecord 가 생성된 시간 |
filename | %(filename)s | pathname의 파일명 부분 |
funcName | %(funcName)s | 로깅 호출을 포함하는 함수의 이름 |
message | %(message)s | 로그된 메시지 |
levelname | %(levelname)s | 메시지의 텍스트 로깅 수준 (’DEBUG’, ‘INFO’, “WARNING’, ‘ERROR’, ‘CRITICAL’) |
출력된 시간, 로깅 수준, 파일명, 메소드, 메시지가 포멧팅된 로깅 코드이다.
def logging_formatting():
logging.basicConfig(format=f'[%(asctime)s] [%(levelname)s] %(filename)s - %(funcName)s : %(message)s', level=logging.DEBUG)
logging.debug('test')
time.sleep(1)
logging.debug('test')
출력 결과
[2022-08-28 20:40:27,904] [DEBUG] logging_dummy.py - logging_formatting : test
[2022-08-28 20:40:28,915] [DEBUG] logging_dummy.py - logging_formatting : test
'Programming > [Python]' 카테고리의 다른 글
[Python] 단위 테스트를 해보자 UnitTest (0) | 2022.08.30 |
---|