관리 메뉴

솜씨좋은장씨

[Python] logging 중복 로그 해결하는 방법 본문

Programming/Python

[Python] logging 중복 로그 해결하는 방법

솜씨좋은장씨 2020. 12. 17. 09:33
728x90
반응형

최근에 API를 만들면서 API 요청에 대한 로그를 남겨야하는 일이 있어 python의 logging을 활용하여

로그를 남기려고 코드를 작성하여 실행하였는데 로그를 찍으면 찍을 수록

중복되어 찍히는 로그가 점점 많아 졌습니다.

 

수정 전 코드

import os
import logging
import logging.handlers

def request_log(query, subj, prop, top1_prop, elapsed_time):
    dir_path = "./log_data/kbqa"

    if not (os.path.isdir(dir_path)):
        os.makedirs(os.path.join(dir_path))

    logger = logging.getLogger("kbqa_search")
    logger.setLevel(logging.INFO)

    file_handler = logging.handlers.TimedRotatingFileHandler(
        filename='./log_data/kbqa/search', when='midnight', interval=1, backupCount=31, encoding='utf-8')

    file_handler.suffix = '%Y%m%d.log'

    formatter = logging.Formatter('%(asctime)s | %(name)s | %(message)s')

    logger.addHandler(file_handler)
    file_handler.setFormatter(formatter)
    
    logger.info('{} | {}ms | {} | {} | {}'.format(query, elapsed_time, subj, prop, top1_prop))

 

수정 전에는 API에서 request_log를 활용하여 logger 인스턴스를 만들고 info( ) 를 활용하여 로그를 남겼습니다.

 

이렇게 하면 API에서 request_log를 호출하였을때 logger를 가져와서 로그를 남기고 나서 버려진다고 생각할 수 있지만

 

뒤에서는 getLogger로 생성했던 인스턴스가 계속 메모리에 남아 있어 문제가 발생합니다.

 

그 후에 addHandler를 호출하는데 이에 request_log를 호출 할 때마다 동일한 로거에 새로운 핸들러가 계속 등록됩니다.

 

이에 가면 갈수록 불필요한 로그가 많이 쌓이는 문제가 발생하는 것이었습니다.

 

해결 방법은 핸들러를 한번만 호출하도록 하면 됩니다.

 

 

수정 후 코드

import os
import logging
import logging.handlers

def get_logger():
    dir_path = "./log_data/kbqa"

    if not (os.path.isdir(dir_path)):
        os.makedirs(os.path.join(dir_path))

    logger = logging.getLogger("kbqa_search")
    logger.setLevel(logging.INFO)

    file_handler = logging.handlers.TimedRotatingFileHandler(
        filename='./log_data/kbqa/search', when='midnight', interval=1, backupCount=31, encoding='utf-8')

    file_handler.suffix = '%Y%m%d.log'

    formatter = logging.Formatter('%(asctime)s | %(name)s | %(message)s')

    logger.addHandler(file_handler)
    file_handler.setFormatter(formatter)

    return logger

REQUEST_LOGGER = get_logger()

def request_log(query, subj, prop, top1_prop, elapsed_time):
    REQUEST_LOGGER.info('{} | {}ms | {} | {} | {}'.format(query, elapsed_time, subj, prop, top1_prop))

 

위와 같이 핸들러를 호출하는 부분을 따로 만들어두고 전역변수로 하나 미리 만들어 둔 뒤

request_log에서 활용하도록하니 문제가 해결되었습니다.

 

읽어주셔서 감사합니다.

Comments