티스토리 뷰
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 관련해서 더 필요한 부분이 있다면 댓글로 남겨주세요. 관련 내용을 찾아서 추가 포스팅해 보겠습니다.
끝..
'Python(파이썬)' 카테고리의 다른 글
python 으로 나에게 카카오톡 메시지 보내기 (0) | 2023.03.01 |
---|---|
Python - logging 모듈 , 두번째 (0) | 2022.12.24 |
Django - Product 모델을 위한 view 와 templates 만들기 (0) | 2019.11.20 |
Django - Category 모델을 위한 view 와 template 만들기 (0) | 2019.11.20 |
Django - shell 을 이용한 queryset 사용하기 (0) | 2019.11.19 |
- Total
- Today
- Yesterday
- Karabiner-Elements
- venv
- slack api
- win10
- python slack
- 프로젝트 생성
- 미밴드4
- df 명령어
- http 요청
- channel oauth
- 메시지 전송
- Python
- cmd창
- END key
- angular
- webhook
- 미밴드
- vscode
- cmd실행
- python message
- 팀 소통
- 장고
- du 명령어
- HOME key
- django
- amaztools
- 디스크 사용량
- 파이썬
- win7
- HOME/END
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |