[파이썬 Python] 로깅 logging

2020. 12. 24. 18:24python

728x90
반응형

 

logging


1. 사용 이유

보통 처음 개발을 시작한다면 print 함수를 쓸것이다.

logging 모듈은 파이썬 자체에 내장되어 있는 모듈로 사용이 간편하고 강력하다.

사용방법은 4번 부터 보면 된다.


 

2. level

logging 모듈은  중요도를 level로 구분한다.

  • DEBUG - 간단한 문제
  • INFO - 확인 메시지, 정보
  • WARNING - 잘 작동은 하나 예상치 못한 일이 발생 했거나 예측될때
  • ERROR - 큰 문제로 몇몇 기능을 수행하지 못할때 
  • CRITICAL - 작동이 불가능한 수준의 심각한 에러

3. logging flow

logger, handler, filter, formatter 가 있다. 

 

Logger: 어플리케이션 코드가 직접 사용할 수 있는 인터페이스를 제공.
Handler: logger에 의해 만들어진 log를 적합한 위치로 보낸다.
Filter: 어떤 log가 출력되어야 하는지를 결정.
Formatter: log의 최종 출력되는 레이아웃을 결정.


 


4. 사용법

1. 로깅을 위해 필요한 모듈을 import 한다.

import logging

2. 인스턴스(instance) logger를 생성한다.

logger = logging.getLogger('name')

3. logger level 부여

 

이중 원하는 수준의 level로 써주면 된다.

DEBUG로 설정하면 그아래 모든 level이 출력된다.

INFO로 설정하면 DEBUG를 제외한 그아래 모든 level이 출력된다.

logger.setLevel(logging.DEBUG)
logger.setLevel(logging.INFO)
logger.setLevel(logging.WARNIG)
logger.setLevel(logging.ERROR)
logger.setLevel(logging.CRITICAL)

5. handler 과 formatter

formatter

log 가 어떠한 형식으로 찍힐 것인지 포맷을 결정한다.

원하는 형식으로 짜면된다.

logging.Formatter(
  fmt = None,     # 메시지 출력 형태. None일 경우 raw 메시지를 출력.
  datefmt = None, # 날짜 출력 형태. None일 경우 '%Y-%m-%d %H:%M:%S'.
  style = '%'     # '%', '{', '$' 중 하나. `fmt`의 style을 결정.
)

formatter = logging.Formatter(fmt = '%(asctime)s %(levelname)s %(message)s', 
                              datefmt = '%Y-%m-%d %H:%M:%S')

 

속성이름 format 설명
created %(created)f 시간 표시
filename %(filename)s pathname 의 file이름 부분 
funcName %(funcName)s logging call 포함하는 fuction의 이름
levelname %(levelname)s logging level
(ex.DEBUG)
lineno %(lineno)d logging call 발생한 코드의 line number
module %(module)s file module 이름
message %(message)s 메시지
name %(name)s logger 이름
pathname %(pathname)s 파일 path
thread %(thread)d thread ID
threadName %(threadName)s thread 이름

 

handler

# 오늘 날짜를 찍어주어 로그 파일명을 오늘 날짜로 만들어 주기 위해
now = datetime.datetime.now().isoformat()[:10]
logfile_name = f'{now}.log'

# formatter 객체 생성
formatter = logging.Formatter(fmt="%(asctime)s | %(levelname)s | %(message)s")

# handler 객체 생성
stream_handler = logging.StreamHandler()
file_handler = logging.FileHandler(filename=logfile_name)

# handler에 level 설정
stream_handler.setLevel(logging.INFO)
file_handler.setLevel(logging.DEBUG)

# handler에 format 설정
stream_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)

logger에 생성한 handler 추가하기

logger.addHandler(stream_handler)
logger.addHandler(file_handler)

 

 

 

Logging Cookbook — Python 3.9.1 documentation

Sometimes you want logging output to contain contextual information in addition to the parameters passed to the logging call. For example, in a networked application, it may be desirable to log client-specific information in the log (e.g. remote client’s

docs.python.org

 

 

반응형

'python' 카테고리의 다른 글

OrderedDict vs defaultdict vs dict  (0) 2021.01.03
[파이썬 python] 딕셔너리 ditionary  (0) 2020.12.16
[파이참 PyCharm] 단축키  (0) 2020.12.15
[파이썬 python] print(), sep='', end=''  (0) 2020.12.09
plt.plot 한글 폰트 깨짐 현상  (0) 2020.08.03