TIL#161 python log multiprocessing

Dasom·2022년 5월 13일
0

python

목록 보기
50/50

python logging 라이브러리는 멀티프로세싱을 고려하지 않고 만들어진 패키지라고 한다. logging을 이용해 TimedRotatingFileHandler를 사용한 logger 함수를 만들고 log = logger()net_log = logger('network') 로 루트 로그와 네트워크 로그를 만들어 한 파일에 로그를 찍는 방식으로 구현하였는데, 로컬에서는 잘 동작하던 함수가 배포를 하니 제대로 동작하질 않았다. 루트 로그와 네트워크 로그가 다른 파일에 써지기도 하고, 날짜도 맞질 않고, 덮어쓰기가 되어서 이전 기록이 지워지기도 하였다. 그래서 알아보니 logging 라이브러리는 멀티프로세싱이 고려되지 않아 여러개의 프로세스를 한파일로 몰아서 저장시키는 것이 잘 동작하지 않는다는 것을 알았다. 파이썬 로그 쿡북에도 자세한 이야기들이 써있었지만 조금 더 나에게 맞는 블로그를 찾다가 우연히 누군가 패키지를 만들어 올려놓은 것을 발견했다...!

한번 사용해 보기로 하고 배포까지 완료후, 결과는 성공적!
며칠 더 지켜봐야겠지만, 일단은 log와 net_log가 서로 다른 파일로 저장되는 것과 덮어쓰기 되는 현상은 고쳐진 것 같다.

참고링크

import logging
import logging.handlers
import os

from mpfhandler import MultProcTimedRotatingFileHandler

def logger(name=None):
    # create log instance
    logger = logging.getLogger(name)

    # logger level 가장 낮은 수준으로 지정
    logger.setLevel(logging.DEBUG)

    # 하위 logger 가 root logger 로 출력 내용을 전달하여 이중출력되는 것을 방지하기 위해 False 설정
    logger.propagate = False

    # formatter 지정
    formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(funcName)s - %(message)s")

    # handler instance 생성
    # file_handler = logging.handlers.TimedRotatingFileHandler(
    #     filename=f'logs/log.log', when='MIDNIGHT', interval=1, encoding='utf-8'
    # )
    logfile = os.path.abspath(f'logs/log.log')
    file_handler = MultProcTimedRotatingFileHandler(logfile, when='D')

    # handler 출력 format 지정
    file_handler.setFormatter(formatter)

    # logger 에 handler 추가
    logger.addHandler(file_handler)

    return logger


log = logger()
net_log = logger('network')

아 그리고 패키지 내에 오류가 한가지 존재했는데
except Exception, e: 라는 부분이었고 except Exception as e: 로 수정해주어야 했다. 위의 참고링크로 들어가 파일 전체를 복사해서 프로젝트에 파일을 새로 만들어 붙여넣기 하여 수정한 후 import 해서 사용하는 것도 방법일 것 같다.

profile
개발자꿈나무🌲

2개의 댓글

comment-user-thumbnail
2023년 6월 3일

안녕하세요. 유용한 글 감사합니다. 혹시 계속 모니터링 해본 결과는 어떤지요?

1개의 답글