2012-06-21 18 views
5

Jak utworzyć rejestrator globalny, aby móc go używać w każdym module, który wykonuję?Rejestrowanie globalne w języku Python

Coś takiego w moduleA:

import logging 
import moduleB 

log = logging.getLogger('') 

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

Mając to na moduleB:

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

Obecnie będę się błąd, ponieważ moduleB nie wie, co log jest. Jak to obejść?

Odpowiedz

17

Możesz utworzyć swój własny "moduł" logowania, który tworzy instancję rejestrującą, zamiast tego zaimportuje je cały twój kod. Pomyśl:

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

bardzo dziękuję – MFB

+0

To rozwiązanie działa jak czar nawet z instalacji niestandardowych rejestratora. – Centurion

2

Moduł ma domyślnie dostęp tylko do builtin functions i builtin constants. Dla wszystkich innych zmiennych, funkcji ... musisz użyć słowa kluczowego import.

Teraz za konkretny przykład, można importować log -variable z moduleA w modulesB tak:

from moduleA import log 

Poniższy byłoby równoznaczne ponieważ logging -module zwraca taką samą instancję rejestratora, który był powrócił do moduleA:

import logging 
log = logging.getLogger('') 

Innym rozwiązaniem dla Ciebie może być w użyciu domyślnego-logger modułu jak jes logging s:

logging.info("Hello") 
+0

bardzo dziękuję – MFB

2

Tworzenie globalnej rejestrator, który może być używany do

  1. Utwórz nowy plik dziennika lub
  2. zwraca dziennik zdarzeń dla globalnego pliku dziennika.

Utwórz moduł o nazwie o nazwie myLogger.py: Będzie to miało kod tworzenia dziennika

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 

teraz, aby utworzyć nowy dziennik w module powiedzieć .py

from myLogger import myLog 
log = myLog(__name__, 'newLog.log') 
log.debug("In new log file") 

W ten sposób musisz podać nazwę pliku podczas pobierania programu rejestrującego.

Aby użyć globalnego programu rejestrującego w A.py:

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

Nie musisz podawać nazwy pliku w tym przypadku, ponieważ będziemy używać dziennika globalnego.

Powiązane problemy