개발을 하다 보면 에러가 자주 발생한다.
(내가 짠 코드가 한 번에 잘 실행되면 불안할 정도..)
이 때, 에러의 원인을 찾기 위해 우리는 실시간으로 '로그'를 찍는다. (logging)
혹은 잘 돌고 있는지 확인하기 위해 찍기도 한다.
그런데 이 로그들을 파일로 기록해야 할 때가 있다.
- 로그량이 너무 많아서 확인이 어려울 때
- 매 시간 로그를 들여다보기 어려울 때 (ex. 프로젝트가 운영 단계에 접어들어 24시간 내내 돌기 시작한 경우)
이럴 때 'logging' 을 이용하여 로그를 파일로 남겨 나중에 천천히 확인할 수 있다.
1. Logger 선언, 출력 형식 지정
import logging
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s %(name)s %(levelname)s %(message)s')
위와 같이 선언해두고 logger 를 이용해서 로그를 찍는다.
로그 레벨은 크게 다섯 가지가 있다.
DEBUG | INFO | WARN | ERROR | CRITICAL |
오른쪽으로 갈 수록 서비스 영향도가 매우 큰, 꼭 찍어야 하는 레벨이라고 보면 된다.
DEBUG 레벨은 보통 개발자가 확인하는 용도로 사용한다.(디버깅)
logger.debug("DEBUG 모드")
logger.info("INFO 모드")
logger.warn("WARN 모드")
이렇게 코드를 작성하고 각각 DEBUG, INFO 레벨로 logger 를 설정해두면
logger.setLevel(logging.DEBUG) # DEBUG level 까지 로깅
# 결과
DEBUG 모드
INFO 모드
WARN 모드
logger.setLevel(logging.INFO) # INFO level 까지 로깅
# 결과
INFO 모드
WARN 모드
이렇게 찍힌다.
formatter 는 로그 형식을 지정한다.
보통 위 내용처럼 (시간)-(해당되는 클래스 이름)-(로그 레벨)-(로그 메시지) 로 표시한다.
2. StreamHandler 적용
streamhandler = logging.StreamHandler()
streamhandler.setFormatter(formatter)
logger.addHandler(streamhandler)
logger 에는 다양한 handler 를 적용할 수 있다.
Streamhandler 는 sys.stdout, sys.stderr 같은 stream 으로 로그를 출력하는 역할을 한다.
사용법은 간단하다.
streamhandler 선언 후, 앞서 지정한 formatter 를 적용하여 logger 에 add 시키면 streamhandler 클래스가 적용된다.
3. FileHandler 적용
import datetime
filehandler = logging.FileHandler('C:\\test\\logfile_{:%Y%m%d}.log'.format(datetime.datetime.now()), encoding='utf-8')
filehandler.setFormatter(formatter)
logger.addHandler(filehandler)
FileHandler 는 로그를 파일로 출력한다.
datetime 으로 현재 날짜를 계산하여 C:\test\logfile_YYYYMMDD.log 형태로 로그 파일을 생성한다.
그런데 이 때, 한 번 생성된 파일에 로그가 계속해서 쌓이는데
이 경우 파일 사이즈가 지나치게 커질 수 있다.
4. TimedRotatingFileHandler 적용
import logging.handlers
timedfilehandler = logging.handlers.TimedRotatingFileHandler(filename='logfile', when='midnight', interval=1, encoding='utf-8')
timedfilehandler.setFormatter(formatter)
timedfilehandler.suffix = "%Y%m%d"
logger.addHandler(timedfilehandler)
TimedRotatingFileHandler 를 사용하면 로그를 일별 파일에 자동저장할 수 있다.
1) 자정에(when=midnight) 로그 파일을(filename=logfile.log) 생성
2) 1일 동안(interval=1) 로그 축적
3) 다음 자정이 지나면 기존 파일은 logfile.log.20210628 로 이름 변경(롤링), 신규 logfile.log 파일 생성
(suffix=%Y%m%d)
위 과정이 반복된다.
** 참고
한글로 된 line이 로그에 찍히지 않는다면 encoding='utf-8' 옵션을 주면 된다.
logger 로 생성되는 로그 파일에 한글이 찍히게 하려면 encoding 옵션을 꼭 넣어줄 것!
':: python' 카테고리의 다른 글
python :: 파이썬 zfill 로 문자열, 숫자 앞에 0 붙이기 (01, 002) (0) | 2021.06.30 |
---|---|
python :: 파이썬 딕셔너리(dictionary) <-> json 변환하기, 딕셔너리 출력 포맷 '(홑따옴표) 대신 "(쌍따옴표) 로 나타내기 (2) | 2021.06.29 |
python :: 파이썬 텍스트 파일 내 특정 단어 치환(replace)하기 (3) | 2021.06.23 |
python :: 파이썬 requests 로 REST API 호출하기 (2) | 2021.06.21 |
python :: 파이썬 파일 복사 shutil.copy 속도 빠르게 향상시키기 (4) | 2021.06.17 |