[python module] Logging 정리

곽현우·2021년 8월 3일

python

목록 보기
1/1

로깅: 우리의 프로그램이 어떤 상태를 가지고 있는지, 외부출력을 하게 만들어서 개발자가 눈으로 직접 확인할 수 있도록 하는것

python에 자체적으로 logging module은 내장되어 있으므로 별도의 download 없이 import 할 수 있다.

import logging

if __name__ == "__main__":
    logging.error("something wrong!!")
   
output: 
    ERROR:root:something wrong!!

python내 logging의 5가지 등급

DEBUG < INFO < WARNING < ERROR < CRITICAL

DEBUG디버깅시 필요한 정보를 기록하기 위해 사용
INFO계획대로 작동하고 있음을 알리는 확인 메세지
WARNING소프트 웨어는 작동하나 예상하지 못한 일이 발생하거나 예측될 때의 알림
ERROR중대한 문제로 인해 소프트 웨어가 몇가지 기능들을 수행하지 못함을 알림
CRITICAL작동이 불가능한 수준의 심각한 에러가 발생함을 알림

logging module 사용하기

1) 로거 객체 생성

특정한 로거 객체를 따로 만들어서 사용, loger name에 아무것도 입력하지 않을 경우 root logger 가 생성

import logging
logger = logging.getLogger("loger name")

2) 로깅의 레벨 설정

setLevel을 통해 특정 등급 이상의 정보만 출력하도록 설정

import logging
logger = logging.getLogger("loger name")
logger.setLevel(logging.INFO)	# INFO 등급 이상의 메세지만 출력

3) Handler와 Formatter 설정

  • handler

    : level에 따라 적절한 Log 메세지를 지정된 위치(파일, console 등등)에 전달하는 역할을 수행

    addHandler 를 통해 여러 handler를 사용할 수 있다.

    handler의 종류는 15개 정도 존재하고 가장 대표적인 handler는 StreamHandlerFileHandler이다.

    전자는 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)

Format 편리하게 설정

Formatter의 기본적인 Keyword를 활용하여 format을 설정할 수 있다.

속성 이름format설명
asctime%(asctime)s인간이 읽을 수 있는 시간 표시
created%(created)flogRecord가 만들어진 시간
filename%(filename)spathname의 file 이름 부분
funcName%(funcName)slogging call을 포함하는 function의 이름
levelname%(levelname)s메시지의 Text logging level: 예) INFO
lineno%(lineno)dlogging call이 발생한 코드의 line 숫자
module%(module)sfilename의 모듈 이름 부분
message%(message)s메시지
name%(name)slogger의 이름
pathname%(pathname)sfull pathname
thread%(thread)dthread ID
threadName%(threadName)sthread 이름
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/

profile
ML/DL, Computer Vision Engineer

0개의 댓글