python(파이썬)

[Python Error] - log 관리하는 법

sokki 2024. 4. 3. 11:59

프로그래밍을 하다보면 늘 error를 맞딱드리게 되는데 이를 해결하는 방법을 알아야 한다. 먼저, 필요한 것은 에러를 기록하고 관리하는 것인데 이를 로깅이라고 한다. 이를 위해 파이썬 자체에서 제공하는 logging API가 있다. 이를 활용해서 logging을 해볼 수 있다. 


import logging
logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.DEBUG, filelog="mylog.log", filemode="w")

위에서 보는 것을 설명해보자.

  • format : log가 작성될때 시간과 메시지를 나타내는 포맷팅 방법이다.
  • 다level : level은 log가 기록되는 차원을 말하는데, DEBUG, INFO 등이 있다. 
  • filelog : log가 기록되는 파일이다. 
  • filemode : w로 적으면 log가 생성될 때마다 리셋된다. 

위를 이용해서 logging을 하면되는데, 보통 로깅을 할 때에는 에러가 발생할 수 있는 부분이나, 어떤 값이 나타났는지 기록해둬야 하는 때에 사용하면 편하다. 어떤 사람들은 그냥 print를 이용해서 로그를 이용하기도 하는데, 문제는 print는 stdout에 해당하고, error 메시지의 경우 stderr에 해당하기 때문에 출력에 조금 차이가 있다. 다음의 예시를 보자.
(출처 : https://blog.sentry.io/logging-in-python-a-developers-guide/)

x = 3
y = 4

logging.info(f"The values of x and y are {x} and {y}.")
try:
    x/y
    logging.info(f"x/y successful with result: {x/y}.")
except ZeroDivisionError as err:
    logging.error("ZeroDivisionError",exc_info=True)

여기서 보여주는 것은 로깅이 되는 과정에서 error가 발생할 경우 logging.error가 설정한 파일에 저장되게끔 할 수 있다. 그런데 문제는 내가 모르는 문제가 발생하는 경우가 생길 때다. 그럴 때는 어떻게 logging을 할 수 있을까?

그럴 때는 logging 모듈을 사용하기보다는 쉘에서 stdout과 stderr를 동시에 입력해서 log 파일에 기록해보는 방식으로 해보는 게 좋을 듯 하다. 이때, logging 모듈을 굳이 이용할 필요는 없다. 

$ python my_program.py &> mylog.log

위와 같이 치면 모든 stdout과 stderr가 mylog에 동시에 적히게 된다. 그래서 프로그램이 종료되거나 내가 예상하지 못한 상황에서 조기종료 되었을 때, error를 확인할 수 있고 대응을 해나갈 수 있다.