2012-06-21 7 views
5

로거를 어떻게 만들어서 모든 모듈에서 사용할 수 있습니까? moduleA이 같은파이썬 글로벌 로깅

뭔가 : moduleB에두고

import logging 
import moduleB 

log = logging.getLogger('') 

result = moduleB.goFigure(5) 
log.info('Answer was', result) 

: moduleB이 log이 무엇인지 모르기 때문에 현재

def goFigure(integer): 
    if not isinstance(integer, int): 
     log.critical('not an integer') 
    else: 
     return integer + 1 

, 나는 오류가 발생합니다. 어떻게해야합니까?

답변

17

로거를 인스턴스화하는 자체 로깅 "모듈"을 만들 수 있습니다. 대신 모든 코드를 가져 오는 것이 좋습니다. 생각 :

logger.py :

import logging 
log = logging.getLogger('') 

codeA.py :

from logger import log 
log.info('whatever') 

codeB.py :

from logger import log 
log.warn('some other thing') 
+0

대단히 감사합니다. – MFB

+0

이 솔루션은 맞춤형 로거 설정에서도 매력적이었습니다. – Centurion

2

모듈은 기본적으로 builtin functionsbuiltin constants에만 액세스 할 수 있습니다. 다른 모든 변수, 함수의 경우 ... import 키워드를 사용해야합니다.

은 이제 구체적인 예를 들어, 다음과 같이 modulesBmoduleAlog - 변수를 가져올 수 있습니다

from moduleA import log 

동등한 것 다음이었다 로거의 동일한 인스턴스를 반환 -module logging 때문에 moduleA에 반환

import logging 
log = logging.getLogger('') 

당신을위한 또 다른 해결책은 생 같은 logging 모듈의 기본 로거를 사용할 수 s :

logging.info("Hello") 
+0

고맙습니다. – MFB

2

에 사용할 수있는 글로벌 로거 만들기
  1. 새 로그 파일을 만들거나
  2. 은 글로벌 로그 파일에 대해 logger를 반환합니다.

라는 myLogger.py라는 모듈을 만들고 :

이제
import logging 

def myLog(name, fname = 'myGlobalLog.log'): 
'''Debug Log'''                         
    logger = logging.getLogger(name);                    
    logger.setLevel(logging.DEBUG)                     
    fhan = logging.FileHandler(fname)                    
    fhan.setLevel(logging.DEBUG)                      
    logger.addHandler(fhan)                       
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')       
    fhan.setFormatter(formatter) 
    '''comment this to enable requests logger'''                  
    #logger.disabled = True 
    return logger 

모듈에서 새 로그를 생성하는이 말 :이

이 myLogger.py 로그 생성 코드를가집니다 .py

따라서 로거를 가져 오는 동안 파일 이름을 전달해야합니다.

A.에서 글로벌 로거를 사용하려면py :

from myLogger import myLog 
log = myLog(__name__) 
log.debug("In myGlobalLog file") 

글로벌 로그를 사용할 때 파일 이름을 전달하지 않아도됩니다.