reload()를 사용하더라도 logging의 logger 객체에 Hanlder를 다중 등록하지 않습니다.

8068 단어 Python
이 글은 Takumi Akashiro 혼자 Advent Calendar 2020의 17일째 글이다.
아직 logging의 예쁜 사용법을 몰라요...이렇게 생각하면서 쓴 기사입니다.
양해 부탁드립니다.

개시하다


일반적인 Pytohon을 쓰면 우선 reload 함수를 사용하지 않습니다.
하지만 DCC 도구 개발에 종사하고 싶은 TA와 디자이너의 말reload()은 본 적이 있다.
(이번 기사는 파이톤3으로 쓰여져 3과에서 추천하지 않는reload() 대신 사용importlib.reload().)
하지만 간단한 reload()를 사용하면 로거는 망가진다.
#! python3
import logging

logger= logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

sh = logging.StreamHandler()
sh.setFormatter(logging.Formatter('%(levelname)s: %(message)s'))

logger.addHandler(sh)

def main():
    pass
    logger.debug("test")

if __name__ == '__main__':
    main()
일반적

문제 없어요.
그리고 해석기import로 모듈main()을 실행한다.

이거reload() 다음에 해볼게main().

네, 한 줄을 많이 썼어요.reload() 재평가 모듈 때 재평가log.addHandler(sh)했기 때문이다.
이러한 상황을 피하기 위해서, 우리는logger가 사용하는 모듈을 분리해 보았다.
log.py
#! python3
import logging

def __gen_logger():
    # これだとlog階層に集まってしまうので間違いですが、、
    # 時間がないので見逃してください!
    logger_ = logging.getLogger(__name__)
    logger_.setLevel(logging.DEBUG)

    sh = logging.StreamHandler()
    sh.setFormatter(logging.Formatter('%(levelname)s: %(message)s'))

    logger_.addHandler(sh)

    return logger_


logger = __gen_logger()


def get_logger():
    return logger

logger_sample.py
#! python3
import log

def main():
    logger = log.get_logger()
    logger.debug("test")

if __name__ == '__main__':
    main()

이러면 중복 안 돼요!

모듈을 분리하지 않는 방법


근데 매번 로그야.py와 같은 로거용 부모듈도 만들 수 있을 것 같아요.
최근에 나는 좋은 방법을 하나 찾았다.
#! python3
import logging

def get_logger():
    logger_ = logging.getLogger(__name__)
    if logger_.hasHandlers() is False:
        logger_.setLevel(logging.DEBUG)

        sh = logging.StreamHandler()
        sh.setFormatter(logging.Formatter('%(levelname)s: %(message)s'))

        logger_.addHandler(sh)

    return logger_

def main():
    logger = get_logger()
    logger.debug("test")

if __name__ == '__main__':
    main()

끝맺다


간단한 리로드()가 만든 스크립트 멸종하세요.

좋은 웹페이지 즐겨찾기