로깅: 우리의 프로그램이 어떤 상태를 가지고 있는지, 외부출력을 하게 만들어서 개발자가 눈으로 직접 확인할 수 있도록 하는것
python에 자체적으로 logging module은 내장되어 있으므로 별도의 download 없이 import 할 수 있다.
import logging
if __name__ == "__main__":
logging.error("something wrong!!")
output:
ERROR:root:something wrong!!
DEBUG < INFO < WARNING < ERROR < CRITICAL
| DEBUG | 디버깅시 필요한 정보를 기록하기 위해 사용 |
|---|---|
| INFO | 계획대로 작동하고 있음을 알리는 확인 메세지 |
| WARNING | 소프트 웨어는 작동하나 예상하지 못한 일이 발생하거나 예측될 때의 알림 |
| ERROR | 중대한 문제로 인해 소프트 웨어가 몇가지 기능들을 수행하지 못함을 알림 |
| CRITICAL | 작동이 불가능한 수준의 심각한 에러가 발생함을 알림 |
특정한 로거 객체를 따로 만들어서 사용, loger name에 아무것도 입력하지 않을 경우 root logger 가 생성
import logging
logger = logging.getLogger("loger name")
setLevel을 통해 특정 등급 이상의 정보만 출력하도록 설정
import logging
logger = logging.getLogger("loger name")
logger.setLevel(logging.INFO) # INFO 등급 이상의 메세지만 출력
handler
: level에 따라 적절한 Log 메세지를 지정된 위치(파일, console 등등)에 전달하는 역할을 수행
addHandler 를 통해 여러 handler를 사용할 수 있다.
handler의 종류는 15개 정도 존재하고 가장 대표적인 handler는 StreamHandler와 FileHandler이다.
전자는 console, 후자는 File에 전달
formatter
: 메세지를 어떻게 출력할 것인지 설정해주는 객체
logging.Formatter(
fmt = None, # 메시지 출력 형태. None일 경우 raw 메시지를 출력.
datefmt = None, # 날짜 출력 형태. None일 경우 '%Y-%m-%d %H:%M:%S'.
style = '%' # '%', '{', '$' 중 하나. `fmt`의 style을 결정.
)
# handler와 formatter 설정에 관한 전체적인 과정
# 1. handler 객체 생성
stream_handler = logging.StreamHandler()
file_handler = logging.FileHandler(filename="information.log")
# 2. formatter 객체 생성
formatter = logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)s - %(message)s")
# 3. handler에 level 설정
stream_handler.setLevel(logging.INFO)
file_handler.setLevel(logging.DEBUG)
# 4. handler에 format 설정
stream_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)
# 5. logger에 생성한 handler 추가
logger.addHandler(stream_handler)
logger.addHandler(file_handler)
Formatter의 기본적인 Keyword를 활용하여 format을 설정할 수 있다.
| 속성 이름 | format | 설명 |
|---|---|---|
| asctime | %(asctime)s | 인간이 읽을 수 있는 시간 표시 |
| created | %(created)f | logRecord가 만들어진 시간 |
| filename | %(filename)s | pathname의 file 이름 부분 |
| funcName | %(funcName)s | logging call을 포함하는 function의 이름 |
| levelname | %(levelname)s | 메시지의 Text logging level: 예) INFO |
| lineno | %(lineno)d | logging call이 발생한 코드의 line 숫자 |
| module | %(module)s | filename의 모듈 이름 부분 |
| message | %(message)s | 메시지 |
| name | %(name)s | logger의 이름 |
| pathname | %(pathname)s | full pathname |
| thread | %(thread)d | thread ID |
| threadName | %(threadName)s | thread 이름 |
LOG_FORMAT = "[%(asctime)-10s] (줄 번호: %(lineno)d) %(name)s:%(levelname)s - %(message)s"
logging.basicConfig(format=LOG_FORMAT)
logger = logging.getLogger("setting")
logger.setLevel(20)
logger.info("sth happened")
[2019-12-16 13:53:29,889] (줄 번호: 6) setting:INFO - sth happened
Reference
https://hamait.tistory.com/880
https://greeksharifa.github.io/%ED%8C%8C%EC%9D%B4%EC%8D%AC/2019/12/13/logging/