2014-10-16 7 views
3

로거 이름을 하드 코딩하지 않고도 호출 모듈에 구성된 로거를 사용하도록 파이썬 라이브러리 모듈에 일반 로깅을 설정하려고합니다. 호출 모듈에서 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 

답변

2

. 어느 것이 같지 않고 맞춤 스트림 처리기가 설치되어 있지 않습니다.

이 작업을 수행하는 쉬운 방법은 문서 here의 지침에 따라하는 것입니다 '. 항상 같은 로거 객체에 참조를 반환합니다 같은 이름을 가진 getLogger()를 여러 번 호출'

즉, 두 위치 모두에서 getLogger('my_common_name') 만 사용하면 한 곳에서 사용자 정의한 경우에도 두 곳 모두 자동으로 동일한 로거를 가리 킵니다.

추가 : 부모 모듈에서 다음

# In libmodule 

_log = None 

def initLogger(logger=None): 
    global _log 
    if logger != None: 
     _log = logger 
    else: 
     import logging 
     _log = logging.getLogger() 

# Later in the module 
def say(message): 
    _log.info(message) 

: 당신이 부모로부터 로거를 캡처하고 싶은 경우에, 당신은 당신의 라이브러리에 같은 것을 할 것

# In the parent module 
mylog = a logger i set up 

import libmodule 
libmodule.initLogger(mylog) 

그해야 그들 모두가 동일한 로거를 가리 키도록하십시오.

+0

Corley에 답 해주셔서 감사합니다. 이는 내 라이브러리 코드에서 공통 이름을 하드 코딩하는 것을 의미하며 라이브러리 사용자가 동일한 공통 이름을 선택한 경우에만 작동합니다. –

+1

글쎄, 지금은 일종의 (중앙 로깅 모듈을보고 하드 로거를 찾고 있는데, 하나는'__file__'이고 다른 하나는 루트이고, 둘 다 서로 직접보고 있지 않습니다.) 사용자가 라이브러리 로거를 자신의 경로로 재 라우팅 할 수있게하려고합니까? 표준적인 방법은, 예를 들어, 라이브러리 로거를 초기화하는'initLogger()'함수를 가지고, 로거를 전달할 수 있습니다. 로거가 전달되지 않으면 자체로 작성됩니다. 그런 식으로. –

+0

당신은 라이브러리 로거를 사용자가 구성한 로거로 경로 변경하려고한다고 말하는 것이 맞지만 자동으로 해보기를 바라고 있습니다. 'initLogger()'접근 방식은 흥미로운 것으로 들립니다. 당신이 나를 가리킬 수있는 예가 있습니까? –