Logging 모듈 사용 방법
17 Nov 2017 | Pythonlogging 모듈
Python에서는 로그 출력을 위한 logging 모듈을 제공합니다. 아주 간단히 사용할 수 있으며, print 함수 등을 통해 콘솔창에 지저분하게 출력하는 것보다 logging 모듈을 사용하는 것을 추천합니다.
로그 레벨
Python에서 로그 레벨은 다음과 같습니다. 안드로이드 등에서와 거의 동일합니다.
- DEBUG
- INFO
- WARNING
- ERROR
- CRITICAL
간단한 logging 모듈 사용 예제
import logging as log
log.basicConfig(filename='./log.txt', level=log.DEBUG)
if __name__ == '__main__':
log.debug('debug')
log.info('info')
log.warning('warning')
log.error('error')
log.critical('critical')
출력 결과는 다음과 같습니다.
DEBUG:root:debug
INFO:root:info
WARNING:root:warning
ERROR:root:error
CRITICAL:root:critical
basicConfig 함수를 통해서 로그 파일의 이름을 지정할 수 있고, filemode 속성의 값을 a, w 등으로 지정할 수 있습니다. a의 경우 기존 파일에 이어서 기록(Append)하며, w의 경우 기존 파일 내용을 삭제하고 새로 작성합니다.
콘솔창과 파일에 동시에 로그 남기기
import logging
import logging.handlers
log = logging.getLogger('snowdeer_log')
log.setLevel(logging.DEBUG)
fileHandler = logging.FileHandler('./log.txt')
streamHandler = logging.StreamHandler()
log.addHandler(fileHandler)
log.addHandler(streamHandler)
if __name__ == '__main__':
log.debug('debug')
log.info('info')
log.warning('warning')
log.error('error')
log.critical('critical')
Formatter 적용하기
import logging
import logging.handlers
log = logging.getLogger('snowdeer_log')
log.setLevel(logging.DEBUG)
formatter = logging.Formatter('[%(levelname)s] (%(filename)s:%(lineno)d) > %(message)s')
fileHandler = logging.FileHandler('./log.txt')
streamHandler = logging.StreamHandler()
fileHandler.setFormatter(formatter)
streamHandler.setFormatter(formatter)
log.addHandler(fileHandler)
log.addHandler(streamHandler)
if __name__ == '__main__':
log.debug('debug')
log.info('info')
log.warning('warning')
log.error('error')
log.critical('critical')
출력 결과는 다음과 같습니다.
[DEBUG] (log_test.py:19) > debug
[INFO] (log_test.py:20) > info
[WARNING] (log_test.py:21) > warning
[ERROR] (log_test.py:22) > error
[CRITICAL] (log_test.py:23) > critical
Formatter Keywords
| 이름 | 포맷 | 설명 |
|---|---|---|
| asctime | %(asctime)s | 날짜 시간, 밀리세컨드까지 출력. ex) 2017.11.17 12:31:45,342 |
| created | %(created)f | 생성 시간 출력 |
| filename | %(filename)s | 파일명 |
| funcnName | %(funcName)s | 함수명 |
| levelname | %(levelname)s | 로그 레벨(DEBUG, INFO, WARNING, ERROR, CRITICAL) |
| levelno | %(levelno)s | 로그 레벨을 수치화해서 출력(10, 20, 30, …) |
| lineno | %(lineno)d | 소스의 라인 넘버 |
| module | %(module)s | 모듈 이름 |
| msecs | %(msecs)d | 로그 생성 시간에서 밀리세컨드 시간 부분만 출력 |
| message | %(message)s | 로그 메시지 |
| name | %(name)s | 로그 이름 |
| pathname | %(pathname)s | 소스 경로 |
| process | %(process)d | 프로세스(Process) ID |
| processName | %(processName)s | 프로세스 이름 |
| thread | %(thread)d | Thread ID |
| threadName | %(threadName)s | Thread Name |
파일의 최대 용량 및 새로운 파일 생성하는 방법
RotatingFileHandler 함수를 이용해서 파일의 최대 크기 및 새로운 파일을 생성할 때 최대 개수를 지정해줄 수 있습니다. 아래와 같은 코드를 이용해서 최대 10MB씩, 총 20개의 로그 파일을 만들어서 순환하도록 할 수 있습니다.
log_max_size = 10 * 1024 * 1024
log_file_count = 20
fileHandler = logging.handlers.RotatingFileHandler(filename='./log.txt', maxBytes=log_max_size,
backupCount=log_file_count)
logging.handlers
위에서는 FileHandler와 StreamingHandler 및 RotatingFileHandler 등을 사용했었는데 이외에도 다양한 핸들러들이 존재합니다.
| 핸들러 | 설명 |
|---|---|
| SocketHandler | 외부 로그 서버로 소켓을 통해 전송 |
| DatagramHandler | UDP 통신을 통해 외부 서버로 전송 |
| SysLogHandler | Unix 류의 syslog 데몬에게 로그 전송 |
| SMTPHandler | 메일로 로그 전송 |
| HTTPHandler | HTTP를 통해 로그 전송 |