티스토리 뷰

Python(파이썬)

Python - Logging 모듈, 첫번째

브라이언77 2022. 12. 23. 14:32
반응형

Python Logging. 

이번 포스팅에서는 python 에서 기본적으로 제공하고 있는  logging 모듈에 대해서 설명한다.  개발자는 logging 을 통해서 특정 시점에발생하는 이벤트/변수에 대한 값을 확인할 수 있다. 이러한 로깅 모듈이 제공되기 전에는 print 함수를 통해서 값을 일일이 확인하였다. 

 

이번 포스팅을 통해서 앞으로는 print 문 대신에 logging 모듈을 사용해서 프로그램을 좀더 정확하게 만들수 있을 꺼라 생각한다. 파이썬에서 제공하는logging 함수를 사용하기 위해서는 logging 모듈을 import 해주면된다. 

 

import logging

 

파이썬에선 5개의 로그 레벨을 제공하고 있다. 

  • DEBUG          :  상세 정보를 출력 
  • INFO              :  예상한 결과값을 확인하기 위한 출력
  • WARNING     :  프로그램은 정상적으로 동작하나 예상 외의 값을 확인
  • ERROR          :   일부 기능의 오작동이 발생한 경우  
  • CRITICAL      :  프로그램이 중단될 정도의 심각한 오류 

파이썬에서는 기본값으로 warning 레벨을 지정하고 있어서 warning/error/critical 에 대한 메시지를 출력한다. 간단한 예제를 통해서 logging 를 확인해보자. 

 

import logging

logging.debug("Detailed information")
logging.info("Better to watch..")
logging.warning("Watch out!!!")
logging.error("Error, something wrong. ")
logging.critical("The program stopped")
/Users/brian/Documents/src/pythonLogging/bin/python /Users/brian/Documents/src/pythonLogging/bin/tutorial_logging.py 
WARNING:root:Watch out!!!
ERROR:root:Error, something wrong. 
CRITICAL:root:The program stopped

Process finished with exit code 0

파이썬의 로그 기본레벨이 warning 이기 때문에 debug/info 에 대한 메시지는 출력되지 않는다. 

 

기본 logging 에 대한 설정은 console 출력, warnning 로그레벨이고 출력 형식은 바로위의 예제와 같다. 이에 대한 설정을 변경은 logging.basicConfig() 를 통해서 할 수 있다. basicConfig() 을 이용해서 콘솔이 아닌 원하는 파일로 로그를 출력하고, 로그레벨 변경 및 로그형식 또한 변경 할 수 있다. 

 

import logging

logging.basicConfig(filename="myapp.log", level=logging.DEBUG,
                    format='%(name)s - %(levelname)s - %(message)s',
                    filemode='w')

logging.debug("Detailed information")
logging.info("Better to watch..")
logging.warning("Watch out!!!")
logging.error("Error, something wrong. ")
logging.critical("The program stopped")

basicConfig() 에 대한 설정은 프로그램에서 한번만 실행된다. 여러개의 파일에서 basicConfig() 를 설정하게되면, 제일 먼저 실행한 파일에 있는 basicConfig() 가 전체 프로그램에 동작하게된다.  각각의  파일에서 별도의 logger 를 가지고 따로 사용할 수도 있는데, 이 부분은 logging 고급 스킬에서 다룰 예정이다. 

 

로그 출력형식에 사용할 수 있는 변수는 다음과 같다. 

 

자세한 내용은 https://docs.python.org/3/library/logging.html#logrecord-attributes 에서 확인할 수 있다. 

 

filemode 의 경우는 일반적을 파일 open 할때랑 동일하게 사용된다. 'w' 는 쓰기, 'a'는 추가, 'r' 읽기  등을 나타낸다. 모드를 'w'로 설정하면 프로그램을 실행할때마다 기존의 로그가 사라지고 새로운 로그파일이 생성된다. 반면에 'a' 추가 모드로 설정하면 이전 로그파일의 마지막에 새로운 로그를 추가한다. 로그의 경우 일련의 사건을 기록해야 하기 때문에 'a' 로  설정해서 사용한다.

 

예제 1. 로그의 형식 

로그를 확인할때, 개발자가 확인하는 내용을 보면 언제 발생했는지, 어디서 발생하고 어떤 메시지가 있는지 등을 내용이다. 따라서 가장 많이 사용하는 로그의 형식은 time, name, message 가 된다. 

import logging

logging.basicConfig(filename='myTest.log',
                    format='%(asctime)s - %(name)s - %(levelname)s -%(message)s',
                    level=logging.DEBUG)

logging.warning("This is an warning message")
logging.error("This is an error message")

< myTest.log 파일 > 

2022-12-24 07:45:27,893 - root - WARNING -This is an warning message
2022-12-24 07:45:27,893 - root - ERROR -This is an error message

 

 

예제 2. 예외 처리 로그

이번에는 logging 을 이용해서 exception 에러를 처리하는 예제이다. 

import logging

a = 5
b = 0

try:
    c = a / b
except Exception as e:
    logging.error("Exception occurred", exc_info=True)

 위의 예제는 b = 0 이고, 0으로 나눗셈을 한 결과 에러를 발생한다. exc_info = True 로 설정하게 되면, 에러 메시지 뿐만 아니라 시스템에서 제공해주는 에러에 대한 정보까지 로그에 기록하게 된다. 

/Users/brian/Documents/src/pythonLogging/bin/python /Users/brian/Documents/src/pythonLogging/tutorial_exception_stack_trace.py 
ERROR:root:Exception occurred
Traceback (most recent call last):
  File "/Users/brian/Documents/src/pythonLogging/tutorial_exception_stack_trace.py", line 7, in <module>
    c = a / b
ZeroDivisionError: division by zero

Process finished with exit code 0

여기서 logging.error() 대신에 logging.exception()을 사용하게 되면 기본적으로 exception information 를 함께 기록하게 된다. 

import logging

a = 5
b = 0

try:
    c = a / b
except Exception as e:
    logging.exception("Exception occurred")
/Users/brian/Documents/src/pythonLogging/bin/python /Users/brian/Documents/src/pythonLogging/tutorial_exception_stack_trace.py 
ERROR:root:Exception occurred
Traceback (most recent call last):
  File "/Users/brian/Documents/src/pythonLogging/tutorial_exception_stack_trace.py", line 7, in <module>
    c = a / b
ZeroDivisionError: division by zero

Process finished with exit code 0

별도의 옵션이 없이도 똑같은 결과를 확인할 수 있다. 

 

여기까지 logging 에 대한 기본적인 내용이고, 다음 포스팅에서는 여러개의 파일에서 로그를 관리하는 방법에 대해서 작성할 예정이다. 


작성된 내용중에 궁금하신 부분이라 Python 관련해서 더 필요한 부분이 있다면 댓글로 남겨주세요. 관련 내용을 찾아서 추가 포스팅해 보겠습니다. 

 

끝.. 

 

 

 

 

댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함