안녕하세요? 왼하루입니다.
평소에 파이썬에 관심이 많아서, 유용한 모듈나 정보들을 공유해 볼 생각입니다.
오늘은 logging에 대해 확인해보려고 합니다.
파이썬을 비롯한 모든 프로그래밍은 뚝딱뚝딱 프로그램을 만드는 것도 중요하지만, 문제가 발생했을 때 어느지점에서 발생했는지를 찾는 것이 매우 중요합니다. 이를 위해서 log를 남겨두죠. 간단히 코딩할 때에는
print("error")
와 같이 남길 수도 있겠습니다. 하지만 지속적인 처리를 요구하는 서버와 같은 경우에는 terminal 창을 지속적으로 확인하는 경우가 아니기 때문에 log를 확인할 수 없습니다. 이러한 상황 속에서 logging 모듈은 실시간 처리를 요하는 곳에 사용하기 좋은 모듈입니다. 설명은 이쯤에서 마치고, 직접 확인해보겠습니다.
logging
logging은 python 내장 모듈이기 때문에 pip를 이용해서 별도 설치할 필요가 없습니다. import 만 해주시면 됩니다. 나머지 설명은 아래를 참고해주세요.
### log를 세팅 해주는 단계입니다.
# logging 모듈 import
import logging
def get_logger(name=None):
#1 logger instance를 만듭니다.
logger = logging.getLogger(name)
#2 logger의 level을 가장 낮은 수준인 DEBUG로 설정합니다.
logger.setLevel(logging.DEBUG)
#3 formatter 지정하여 log head를 구성해줍니다.
## asctime - 시간정보
## levelname - logging level
## funcName - log가 기록된 함수
## lineno - log가 기록된 line
formatter = logging.Formatter("%(asctime)s - %(levelname)s - [%(funcName)s:%(lineno)d] - %(message)s")
#4 handler instance 생성하여 console 및 파일로 저장할 수 있도록 합니다. 파일명은 txt도 됩니다.
console = logging.StreamHandler()
file_handler_debug = logging.FileHandler(filename="log_debug.log")
file_handler_info = logging.FileHandler(filename="log_info.log")
#5 handler 별로 다른 level 설정합니다. 설정한 level 이하 모두 출력,저장됩니다.
console.setLevel(logging.INFO)
file_handler_debug.setLevel(logging.DEBUG)
file_handler_info.setLevel(logging.INFO)
#6 handler 출력을 format 지정방식으로 합니다.
console.setFormatter(formatter)
file_handler_debug.setFormatter(formatter)
file_handler_info.setFormatter(formatter)
#7 logger에 handler 추가합니다.
logger.addHandler(console)
logger.addHandler(file_handler_debug)
logger.addHandler(file_handler_info)
#8 설정된 log setting을 반환합니다.
return logger
log.py 라는 새 python 파일을 만들어, 위의 내용을 복사합니다.
그 후 기존 작업중이었던 python (log_test.py)파일에 import 해 줍니다.
test code
아래는 log_test.py 입니다.
# log.py 를 import
import log
# import 된 log의 get_logger함수 호출
# test 라는 name의 log instance 생성
logger = log.get_logger("test")
# test_info 함수 정의
def test_info():
# info level의 "info level" 출력
logger.info("info level")
# test_debug 함수 정의
def test_debug():
# debug level의 "debug level" 출력
logger.debug("debug level")
# test_info, test_debug 함수 실행
test_info()
test_debug()
이후 실행하면, terminal 에는 아래와 같이 출력됩니다.
위 log.py 에서 logger 의 format을 설정해줬던 것 처럼
날짜 및 시간정보, log level, 함수 및 logger.info 가 선언된 line 정보, 담고 있는 메세지가 출력됩니다.
logging level
여기에서 test_debug 함수를 실행했음에도 debug level 이 나오지 않는 이유는
log.py 에서 consol level 을 info 로 설정해주었기 때문에 이보다 아랫단인 debug정보는 찍히지 않는 것입니다. 이를 logging.INFO 대신 logging.DEBUG 로 설정한다면 terminal에서도 debug level의 log 정보를 확인할 수 있을 것입니다.
# setLevel 정보
console.setLevel(logging.INFO)
file_handler_debug.setLevel(logging.DEBUG)
file_handler_info.setLevel(logging.INFO)
log 파일 저장
더불어 우리는 log 정보를 level 별로 파일에 저장되도록 하였습니다.
#4 handler instance 생성
console = logging.StreamHandler()
file_handler_debug = logging.FileHandler(filename="log_debug.log")
file_handler_info = logging.FileHandler(filename="log_info.log")
log_test.py를 실행하셨다면, 같은 위치에 log_debug.log, log_info.log 이 두개의 파일이 생성된 것을 볼 수 있습니다.
log_debug.log 에는 debug level 보다 높은 level의 모든정보를 담기 때문에, 아래와 같이 logger.info 의 내용과 logger.debug의 내용이 모두 담겨 있습니다.
log_info.log 에는 info level 이 가장 상단이기 때문에, info 정보만 담고 있음을 확인할 수 있습니다.
마무리
위처럼 간단하게 logging 모듈을 이용하여 log를 남기는 방법을 살펴보았습니다.
위의 내용을 그대로 복사하셔서 log.py를 생성하여 사용하시면 편리하게 import 하여 level별로 기록하고 error 위치를 쉽게 파악할 수 있겠습니다.
실제 log level 과 format 은 더 큰범위로 제공되고 있으니, 필요하시면 검색하시면 되겠습니다.
행복항 개발라이프 되시길 바랍니다~!
감사합니다.
'개발 > python' 카테고리의 다른 글
python 문자열 포매팅, string 을 세밀하게 다루는 방법 (4) | 2022.04.12 |
---|---|
python os 모듈, 알아두면 유용한 5가지 함수 (0) | 2022.04.06 |
python 타입 비교 및 확인, type 함수 대신 isinstance 함수 사용법 (0) | 2022.04.01 |
python 진행 사항 확인, progressbar 간단 사용 방법 (0) | 2022.03.29 |
[python] python 백그라운드 실행, nohup (0) | 2021.09.13 |
댓글