:: python

python :: 파이썬 logging 활용하여 일단위 로그 파일 생성하기 (feat. 로깅이란)

토람이 2021. 6. 28. 18:41

개발을 하다 보면 에러가 자주 발생한다.

(내가 짠 코드가 한 번에 잘 실행되면 불안할 정도..)

이 때, 에러의 원인을 찾기 위해 우리는 실시간으로 '로그'를 찍는다. (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 옵션을 꼭 넣어줄 것!

300x250