로거 이름을 하드 코딩하지 않고도 호출 모듈에 구성된 로거를 사용하도록 파이썬 라이브러리 모듈에 일반 로깅을 설정하려고합니다. 호출 모듈에서 logging.basicConfig()
을 사용하고 라이브러리 모듈에서 logging.debug()
을 호출하는 예제를 많이 보았지만 자체 StreamHandler를 구성하면 작동하지 않습니다. 내가 도대체 뭘 잘못하고있는 겁니까? 내가 libmodule.py이 시도했습니다라이브러리 모듈에서 파이썬 로깅
import logging, logging.handlers
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
consolehandler = logging.StreamHandler()
consoleformatter = logging.Formatter('[%(name)s] %(levelname)s %(message)s')
consolehandler.setFormatter(consoleformatter)
logger.addHandler(consolehandler)
import libmodule
def run():
logger.info("message from calling module")
libmodule.say("message from library module")
:
import logging
def say(msg):
logging.info(msg)
이 :
이
내 호출 모듈입니다import logging
logger = logging.getLogger()
def say(msg):
logger.info(msg)
그러나 두 경우 모두 때 call run()을 호출하면 다음 출력을 얻습니다.
[callingmodule] INFO message from calling module
그러나이 기다리고 있었다 :
첫 번째 인스턴스에서, 당신은 이름으로 로거를 얻고, 두 번째, 당신은 단지 루트 로거를 반환getLogger()
을 사용하기 때문이다
[callingmodule] INFO message from calling module
[callingmodule] INFO message from library module
Corley에 답 해주셔서 감사합니다. 이는 내 라이브러리 코드에서 공통 이름을 하드 코딩하는 것을 의미하며 라이브러리 사용자가 동일한 공통 이름을 선택한 경우에만 작동합니다. –
글쎄, 지금은 일종의 (중앙 로깅 모듈을보고 하드 로거를 찾고 있는데, 하나는'__file__'이고 다른 하나는 루트이고, 둘 다 서로 직접보고 있지 않습니다.) 사용자가 라이브러리 로거를 자신의 경로로 재 라우팅 할 수있게하려고합니까? 표준적인 방법은, 예를 들어, 라이브러리 로거를 초기화하는'initLogger()'함수를 가지고, 로거를 전달할 수 있습니다. 로거가 전달되지 않으면 자체로 작성됩니다. 그런 식으로. –
당신은 라이브러리 로거를 사용자가 구성한 로거로 경로 변경하려고한다고 말하는 것이 맞지만 자동으로 해보기를 바라고 있습니다. 'initLogger()'접근 방식은 흥미로운 것으로 들립니다. 당신이 나를 가리킬 수있는 예가 있습니까? –