프로그램을 짜다 보면 은근히 print구문으로 확인해야 할 것이 많다.
디버깅를 위해 매번 print로 출력하고 난 뒤에 마지막 release 할 때는 print문을 전부 주석 처리 하거나 지우는 일이 발생한다. 또 나중에 다시 디버깅하게 될 일이 생기면 print문을 다시 작성해야 하는 번거로움까지 생기게 된다.
이럴 때 쉽게 사용 할 수 있는 것이 logging이다. (Source: docs.python.org)
프로그램 동작 중에 log를 생성해주고 stream에 출력해 줄 정보의 level을 설정함으로써 평상시 동작할 때는 정상 동작에 관련된 정보만 출력하고, 디버깅 할 때는 세부 항목까지 모두 출력할 수 있도록 할 수 있다.
■ logging 사용하기
– logging 생성
name을 설정하지 않으면 root logger가 생성되며, 기능과 목적에 따른 이름을 부여하여 사용하는 것이 좋다.
import logging
logger = logging.getLogger(__name__)
– logger level 설정
level은 출력 기준을 설정하는 것으로, 설정된 값보다 낮은 level의 log는 출력 되지 않는다.
level은 이름으로 설정할 수도, 숫자의 형태로 설정할 수도 있다.
level 순위: critical > error > warning > info > debug
Level에 따른 설명(Numeric Value) - CRITICAL(50): 작동이 불가능한 수준의 심각한 에러를 발생함을 알림. - ERROR(40): 중대한 문제로 인해 소프트웨어가 몇몇 기능들을 수행하지 못함을 알림 - WARNING(30): 소프트웨어가 작동은 하고 있지만, 예상치 못한 일이 발생했거나, 할 것으로 예측된다는 것을 알림 - INFO(20): 계획대로 작동하고 있음을 알리는 확인 메세지 - DEBUG(10): 간단히 문제를 진단하고 싶을 때 필요한 정보를 기록함.
※ 따라서 평소에는 info나 warning 수준으로 사용하고, 개발시에는 code에서 출력 level만 debug로 출력 되도록 해 놓으면 된다.
logger.setLevel(logging.INFO)
– formatter 설정
fomatter는 메세지를 어떤 방식으로 출력할지 정하는 것으로, 사용자가 읽기 편한 방법으로 설정하게 된다.
format = "[%(asctime)-10s] (줄 번호: %(lineno)d) %(name)s:%(levelname)s - %(message)s"
속성 이름 | format | 설명 |
asctime | %(asctime)s | 인간이 읽을 수 있는 시간 표시 |
lineno | %(lineno)d | logging call이 발생한 코드의 line 숫자 |
name | %(name)s | logger 이름 |
levelname | %(levelname)s | log level |
message | %(message)s | 메세지 |
created | %(created)f | log 생성 시간 |
filename | %(filename)s | path name의 file 이름 |
funcName | %(funcName)s | logging call을 포함하는 function의 이름 |
module | %(module)s | file name의 모듈 이름 |
pathname | %(pathname)s | full path 이름 |
thread | %(thread)d | thread ID |
threadName | %(threadName)s | thread 이름 |
– 최종 code
import logging
logger = logging.getLogger('DeepLink_Blog')
format = '[%(asctime)-10s] (줄 번호: %(lineno)d) %(name)s:%(levelname)s - %(message)s'
logging.basicConfig(format=format)
logger.setLevel(logging.INFO)
logger.info('Well Done')
[2022-12-13 09:13:51,978] (줄 번호: 7) DeepLink_Blog:INFO - Well Done