파이선 실행 로그를 남기기 위해 가장 많이 사용하는 방법은 print함수입니다. 가장 먼저 배우는 함수가 print함수인만큼 친숙하고 쉽기 때문인데요. logging모듈을 이용해서 로그를 남기면 유용하다는 얘기는 많이 들었지만, 습관을 바꾸기는 쉽지 않습니다. 하지만 적용해보니 굉장히 편리하다는 것을 알게 됐습니다. 오늘은 파이썬 로깅 모듈을 이용해서 로그를 남기는 방법에 대해서 알아보겠습니다.

 

 

1. logging모듈을 사용하는 방법

로깅 모듈을 이용해서 로그를 출력하는 방법은 쉽습니다. logging모듈을 import하고 로그 레벨에 해당하는 함수를 호출하면 됩니다.

 

import logging

logging.warn("warn로그입니다.")

 

 

로그를 레벨에 따라 나누고 원하는 메시지만 볼 수 있기 때문에 print함수보다 좋습니다. 로그 레벨은 아래와 같습니다.

 

- 로그 레벨: CRITICAL(50), ERROR(40), WARNING(3), INFO(20), DEBUG(10), NOTSET(0)

 


setLevel 함수로 로그 레벨을 설정하면 해당 레벨 이상의 로그만 볼 수 있습니다. 레벨을 별도로 설정하지 않으면, WARN 레벨 이상의 로그를 볼 수 있습니다.

아래 코드는 INFO레벨 이상의 로그를 보고 싶을 때, 레벨을 설정하는 코드입니다.

 

logging.setLevel(logging.INFO)

 

 

2. 로그를 파일로 저장하기

파일로 저장하고 싶으면 basicConfig함수를 이용하면 됩니다. filename에 저장할 로그파일 이름을 입력합니다. 입력 파라미터가 file일 것 같은데, filename이라 조금 헷갈립니다.

 

logging.basicConfig(filename='example.log',level=logging.DEBUG)

 


basicConfig함수를 이용해서 파일로 로그를 저장하면, 콘솔창에서는 로그가 보이지 않습니다. 콘솔창에서도 로그를 출력하고 싶다면 핸들러(handler)를 이용해야 합니다.

StreamHandler는 콘솔 창을 FileHandler는 로그 파일을 의미합니다. getLogger에서 지정한 로그이름은 다음에 다른 모듈에서도 불러와서 사용할 수 있습니다. 아무 이름도 넣지 않으면 루트 로거를 가져옵니다.

 

콘솔과 파일에 모두 로그를 남기고 싶다면, 아래와 같이 실행합니다.

 

import logging

logger = logging.getLogger('simple_example')
logger.setLevel(logging.DEBUG)

# 콘솔 출력을 지정합니다
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)

# 파일 출력을 지정합니다.
fh = logging.FileHandler(filename="run.log")
fh.setLevel(logging.INFO)

# add ch to logger
logger.addHandler(ch)
logger.addHandler(fh)



핸들러(handler) 로그를 출력하는 부분을 다룬다고 생각하면 됩니다. 여러 개의 파일 핸들러를 만들어서, 레벨별로 출력할 수도 있습니다.

 

 

3. 다른 모듈에도 로깅 모듈을 사용하고 있다면?

이게 참 헷갈렸는데, 다른 모듈에서 basicConfig함수를 이용해서 로깅 모듈을 설정하면, 최초 입력한 설정이 변경되지 않습니다.

 

루트(?) 로거에 로그 파일을 지정하였다면 이후 다른 모듈에서 지정한 로그파일은 무시됩니다. 처음에는 헷갈렸는데 로그는 하나의 파일에 저장되는 것이 깔끔합니다.

그래도 따로 저장하고 방법은 있습니다. getLogger함수를 이용하면 루트 로그를 가져올 수 있는데요. 루트 로그에는 이미 지정한 핸들러가 연결되어 있습니다. 이 핸들러들을 삭제하고, 새로운 로그 파일을 연결하면 됩니다.

 

log = logging.getLogger()

for hdlr in log.handlers[:]:
    log.removeHandler(hdlr)

file_log = logging.FileHandler("log2.log")
file_log.setLevel(logging.INFO)

logging.basicConfig(handlers=[file_log])
logging.error("log2에러")

 

 

4. 로그 파일에 자동으로 시간 넣기

로그에 시간이 기록되면, 실행을 시작한 시간이나 얼마나 걸렸는지 등을 쉽게 확인할 수 있습니다. 방법은 datefmt로 시간 포맷을 정한 뒤에 format에 출력 메시지 레이아웃을 정하면 됩니다. asctime 부분에 앞에서 정의한 시간이 출력됩니다.

 

logging.basicConfig(filename= , level = logging.INFO, datefmt = '%Y-%m-%d %H%M%S'
                   ,format = '%(asctime)s | %(levelname)s | $(message)s')

 


오늘은 이렇게 파이썬 실행 로그를 남기는 logging 모듈에 대해서 알아보았습니다. print함수를 이용해서 로그를 남기고 있다면, 다음에는 logging모듈을 한 번 이용해 보기 바랍니다.

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기