[Python] logging 사용하기(프로그램에 print 그만 사용하기)

Posted by

프로그램을 짜다 보면 은근히 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)dlogging call이 발생한 코드의 line 숫자
name%(name)slogger 이름
levelname%(levelname)slog level
message%(message)s메세지
created%(created)flog 생성 시간
filename%(filename)spath name의 file 이름
funcName%(funcName)slogging call을 포함하는 function의 이름
module%(module)sfile name의 모듈 이름
pathname%(pathname)sfull path 이름
thread%(thread)dthread ID
threadName%(threadName)sthread 이름
format attribute

– 최종 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

Leave a Reply

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다