파이썬 실행 로그를 남겨보자, logging 모듈 이용하기!

2020. 2. 24. 17:00

파이선 실행 로그를 남기기 위해 가장 많이 사용하는 방법은 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 레벨 이상의 로그를 볼 수 있다.

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에러")


print함수를 이용해서 로그를 남기고 있다면, 다음에는 logging모듈을 한 번 이용해보기 바란다.


파이썬을 직접 활용하는 것만큼 효과적인 공부는 없다. 그래서 파이썬을 활용해서 할 수 있는 일드을 정리해보았다. 자세한 내용은 아래 포스팅을 참조해보자.
( 참조: 파이썬 활용, 파이썬 프로젝트로 할 수 있는 일들을 알아보자! )

댓글()