Language/Python

[Python] stream 및 file에 로그 남기기 (logging)

Junhong Kim 2019. 1. 12. 00:37
728x90
반응형


파이썬 표준 라이브러리인 logging을 활용하여 로그를 남기는 방법에 대해 알아봅니다.


[방법1] stream에 로그 남기기

- 스트림(콘솔)에 로그를 찍기 위해 logging을 사용합니다.

import logging

logging.info('my INFO log')
logging.warning('my WARNING log')
# WARNING:root:my WARNING log

위 코드를 실행하면 warning level만 출력되는 이유?

- logging의 default log levelwarning으로 되어있기 때문입니다.


다음 처럼 logging의 basicConfig level을 변경하면 됩니다.

import logging

logging.basicConfig(level=logging.DEBUG)

logging.debug('my DEBUG log')
logging.info('my INFO log')
logging.warning('my WARNING log')
logging.error('my ERROR log')
logging.critical('my CRITICAL log')
# DEBUG:root:my DEBUG log
# INFO:root:my INFO log
# WARNIG:root:my WARNING log
# ERROR:root:my ERROR log
# CRITICAL:root:my CRITICAL log


[방법2] file에 로그 남기기

- basicConfigfilename을 설정하면 해당 위체 로그 파일이 생성됩니다.

- 해당 파일을 열어보면 log가 append 되는 것을 확인할 수 있습니다.

import logging

logging.basicConfig(filename='./server.log', level=logging.DEBUG)

logging.debug('my DEBUG log')
logging.info('my INFO log')
logging.warning('my WARNING log')
logging.error('my ERROR log')
logging.critical('my CRITICAL log')
# DEBUG:root:my DEBUG log
# INFO:root:my INFO log
# WARNIG:root:my WARNING log
# ERROR:root:my ERROR log
# CRITICAL:root:my CRITICAL log

# servevr.log
DEBUG:root:my DEBUG log
INFO:root:my INFO log
WARNIG:root:my WARNING log
ERROR:root:my ERROR log
CRITICAL:root:my CRITICAL log


[방법3] stream과 file에 동시에 로그 남기기

1. logging.getLogger(__name__)으로 logger instance를 생성합니다.

2. stream과 file에 로그를 남기는 handler를 생성합니다.

3. logger instance에 stream과 file handler를 설정합니다.

4. logger instance로 log를 찍습니다.

import logging

# logger instance 생성
logger = logging.getLogger(__name__)

# handler 생성 (stream, file)
streamHandler = logging.StreamHandler()
fileHandler = logging.FileHandler('./server.log')

# logger instance에 handler 설정
logger.addHandler(streamHandler)
logger.addHandler(fileHandler)

# logger instance로 log 찍기
logger.setLevel(level=logging.DEBUG)
logger.debug('my DEBUG log')
logger.info('my INFO log')
logger.warning('my WARNING log')
logger.error('my ERROR log')
logger.critical('my CRITICAL log')


로그 형식(formatting)

import logging
import logging.handlers

# logger instance 생성
logger = logging.getLogger(__name__)

# formatter 생성
formatter = logging.Formatter('[%(asctime)s][%(levelname)s|%(filename)s:%(lineno)s] >> %(message)s')

# handler 생성 (stream, file)
streamHandler = logging.StreamHandler()
fileHandler = logging.FileHandler('./server.log')

# logger instance에 fomatter 설정
streamHandler.setFormatter(formatter)
fileHandler.setFormatter(formatter)

# logger instance에 handler 설정
logger.addHandler(streamHandler)
logger.addHandler(fileHandler)

# logger instnace로 log 찍기
logger.setLevel(level=logging.DEBUG)
logger.debug('my DEBUG log')
logger.info('my INFO log')
logger.warning('my WARNING log')
logger.error('my ERROR log')
logger.critical('my CRITICAL log')


formatter를 적용하면 다음과 같이 출력되는 것을 확인하실 수 있습니다.

(더 다양한 포맷은 여기에서 확인하실 수 있습니다.)

[2019-01-12 00:11:01,045][DEBUG|test.py:24] >> my DEBUG log
[2019-01-12 00:11:01,046][INFO|test.py:25] >> my INFO log
[2019-01-12 00:11:01,046][WARNING|test.py:26] >> my WARNING log
[2019-01-12 00:11:01,046][ERROR|test.py:27] >> my ERROR log
[2019-01-12 00:11:01,046][CRITICAL|test.py:28] >> my CRITICAL log


로그 파일이 커질때 파일 분할

- 파일을 분할하기 위해서는 fileHandler 설정을 변경하면 됩니다.

- maxBytes: 파일 하나의 최대 바이트 수

- backupCount: 백업 파일 개수

(더 다양한 핸들러는 여기에서 확인하실 수 있습니다.)

import logging

# 100MB 파일을 10개까지 남기겠다라는 의미입니다.
fileMaxByte = 1024 * 1024 * 100
fileHandler = logging.handlers.RotatingFileHandler(filename, maxBytes=fileMaxByte, backupCount=10)

References

http://gyus.me/?p=418

728x90
반응형