반응형
문제
아래 예제는 단순히 logging모듈을 이용하여 "hello world"를 출력하는 예제입니다.
예제 코드: https://github.com/sungwook-practice/python_logging_logger.git
# log.py
def getLogger():
"""로거 생성"""
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
stream_handler = logging.StreamHandler(sys.stdout)
stream_handler.setFormatter(formatter)
logger.addHandler(stream_handler)
return logger
# a.py
def printHelloWorld():
logger = getLogger()
logger.debug("hello world")
# main.py
if __name__ == "__main__":
logger = getLogger()
logger.debug("Start main")
printHelloWorld()
logger.debug("[*] End main")
실행하면 놀랍게도 "hello world가 두번 실행됩니다.
문제원인
문제 원인은 getLogger함수를 호출하여 로거를 생성할 때 마다 handler가 1개씩 추가됩니다. 핸들러는 로깅을 담당하므로 핸들러 갯수만큼 로깅갯수도 증가합니다. 즉 1번 getLogger함수를 호출하면 로깅 1번, 2번 호출하면 로깅 2번이 됩니다.
getLogger함수가 호출 될 때, print함수로 handler목록을 출력하여 현재 핸들러를 조회할 수 있습니다.
def getLogger():
"""로거 생성"""
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
stream_handler = logging.StreamHandler(sys.stdout)
stream_handler.setFormatter(formatter)
logger.addHandler(stream_handler)
print(f"logger.name: {logger.name}, handlers: {logger.handlers}")
return logger
해결방법
해결방법은 여러개 입니다. 쉬운 방법은 로거 생성을 함수로 하지 않고 전역변수로 설정하는 것입니다.
# log.py
import logging
import sys
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
stream_handler = logging.StreamHandler(sys.stdout)
stream_handler.setFormatter(formatter)
logger.addHandler(stream_handler)
#a.py
from log import logger
def printHelloWorld():
logger.debug("hello world")
두 번째 방법은 로거를 생성할 때 고유 이름을 설정합니다.
def getLogger(name: str):
logger = logging.getLogger(name)
...
세 번째 방법은 이미 handler가 등록되어 있다면 handler등록을 하지 않습니다.
def getLogger(name: str):
logger = logging.getLogger()
if logger.handlers:
return logger
...
반응형
'전공영역 공부 기록' 카테고리의 다른 글
백준 1062 가르침 (0) | 2023.02.19 |
---|---|
Argocd kustomize --enable-helm 옵션 활성화 (0) | 2023.02.18 |
python logger설정 (0) | 2023.02.14 |
conatinerd insecure설정 (0) | 2023.02.13 |
백준 17471 게리맨더링 (0) | 2023.02.12 |