본문 바로가기
개발/python

[python] logging 이용하여 log 쉽게 남기기

by 왼하루 2021. 9. 13.
반응형

안녕하세요? 왼하루입니다.

평소에 파이썬에 관심이 많아서, 유용한 모듈나 정보들을 공유해 볼 생각입니다. 

오늘은 logging에 대해 확인해보려고 합니다.

 

print

파이썬을 비롯한 모든 프로그래밍은 뚝딱뚝딱 프로그램을 만드는 것도 중요하지만, 문제가 발생했을 때 어느지점에서 발생했는지를 찾는 것이 매우 중요합니다. 이를 위해서 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 해 줍니다. 

log_test.py 에서 log.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 정보

위 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 은 더 큰범위로 제공되고 있으니, 필요하시면 검색하시면 되겠습니다.

 

행복항 개발라이프 되시길 바랍니다~! 

 

감사합니다.

댓글