Notice
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 맥북
- AI 경진대회
- Docker
- dacon
- 편스토랑 우승상품
- 캐치카페
- 백준
- 더현대서울 맛집
- 우분투
- Kaggle
- 코로나19
- 자연어처리
- github
- 프로그래머스
- 데이콘
- gs25
- Baekjoon
- ubuntu
- leetcode
- 금융문자분석경진대회
- 파이썬
- 프로그래머스 파이썬
- hackerrank
- Git
- 편스토랑
- programmers
- PYTHON
- SW Expert Academy
- ChatGPT
- Real or Not? NLP with Disaster Tweets
Archives
- Today
- Total
솜씨좋은장씨
[Python] logging 중복 로그 해결하는 방법 본문
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에서 활용하도록하니 문제가 해결되었습니다.
읽어주셔서 감사합니다.
'Programming > Python' 카테고리의 다른 글
[Python] 자주 활용하는 정규식 모음 (0) | 2020.12.29 |
---|---|
[Python] pdf 파일을 이미지로 변환하는 여러가지 방법 ( feat. pdf2image, tifffile, wand, ImageMagick ) (0) | 2020.12.19 |
[Python] Mac 에서 한글로 된 파일 경로 문제없이 사용하는 방법 (0) | 2020.12.15 |
[Python] datetime을 활용하여 코드 소요시간 측정하기 (0) | 2020.12.06 |
[Python] pdf2image 라이브러리를 활용하여 pdf파일 이미지로 변환하는 방법 (0) | 2020.12.01 |
Comments