2013-06-05 19 views
7

Próbuję dodać rejestrowanie (do konsoli, a nie pliku) do mojego kodu, nad którym pracowałem od dłuższego czasu. Przeczytawszy trochę, mam wzorzec, który moim zdaniem powinien zadziałać, ale nie jestem do końca pewny, dokąd zmierza.Rejestrowanie w języku Python w wielu modułach

Mam następujące trzy pliki (uproszczone, oczywiście):

controller.py

import my_module  
import logging 
from setup_log import configure_log 

def main(): 
    logger = configure_log(logging.DEBUG, __name__) 
    logger.info('Started logging') 
    my_module.main() 

if __name__ == "__main__": 
    main() 

setup_log.py

import logging 

def configure_log(level=None, name=None): 
    logger = logging.getLogger(name) 
    logger.setLevel(level) 
    console_handler = logging.StreamHandler() 
    console_handler.setLevel(logging.DEBUG) 
    chFormatter = logging.Formatter('%(levelname)s - %(filename)s - Line: %(lineno)d - %(message)s') 
    console_handler.setFormatter(chFormatter) 
    logger.addHandler(console_handler) 
    return logger 

my_module.py

import logging 

def main():  
    logger = logging.getLogger(__name__) 
    logger.info("Starting my_module") 
    print "Something" 

if __name__ == "__main__": 
    main() 

Kiedy biegnę th em, tylko pierwsze wywołanie do logowania generuje wyjście do konsoli - "Rejestrowanie rozpoczęte". Drugie wezwanie do logowania - "Uruchomienie mojego modułu" właśnie minęło.

Co zostało źle zrozumiane/zniekształcone?

+1

Dlaczego konfigurujesz dwa osobne rejestratory ('__main__' i' my_module') w pierwszej kolejności, jeśli chcesz je skonfigurować dokładnie w ten sam sposób? Dlaczego po prostu nie użyjesz 'getLogger()' i użyjesz go wszędzie? – abarnert

Odpowiedz

15

Według documentation wygląda jak można uciec z jeszcze prostszej konfiguracji tak:

Jeżeli program składa się z wielu modułów, oto przykład jak można zorganizować rejestrowanie się w nim:

# myapp.py 
import logging 
import mylib 

def main(): 
    logging.basicConfig(filename='myapp.log', level=logging.INFO) 
    logging.info('Started') 
    mylib.do_something() 
    logging.info('Finished') 

if __name__ == '__main__': 
    main() 

# mylib.py 
import logging 

def do_something(): 
    logging.info('Doing something') 

Jeśli prowadzisz myapp.py, powinieneś zobaczyć w myapp.log:

INFO:root:Started 
INFO:root:Doing something 
INFO:root:Finished 

Wygląda na to wezwanie do logger = logging.getLogger(__name__) wewnątrz modułu tworzy osobną ścieżkę (z poziomu NOTSET ale bez związku macierzystego, aby doprowadzić do wpisu)

+1

Dzięki, miałem problemy z głową wokół dokumentów. Aby wyprowadzić na konsolę, wygląda na to, że po prostu nie określam parametru nazwy pliku, jak: 'logging.basicConfig (level = logging.INFO)' –

+0

Po skonfigurowaniu rejestrowania jak powyżej, prawdopodobnie chcesz również zalogować się do konsola.Jest to bardzo prosty sposób dodania dodatkowego modułu obsługi do wszystkich rejestratorów, # dodanie obsługi konsoli do głównego programu rejestrującego, a tym samym do wszystkich instancji rejestratora. logging.getLogger (''). AddHandler (logging.StreamHandler (sys.stdout)) – CodeKid

2

Rzeczywisty błąd może być postrzegane przez umieszczenie linii:

print '__name__', __name__ 

na początku zarówno swoimi main s co daje:

$ python controller.py 
__name__ __main__ 
INFO - controller.py - Line: 8 - Started logging 
__name__ my_module 
Something 

Poprawnie skonfigurowano program rejestrujący o nazwie __main__, ale program rejestrujący o nazwie my_module nie został skonfigurowany.

Głębszym problemem jest to, że masz dwie metody, które prawdopodobnie Cię mylą (tak jak ja).

Powiązane problemy