2013-04-09 11 views
14

Próbuję napisać serwer, który rejestruje wyjątki zarówno do konsoli, jak i do pliku. Wyciągnąłem kod z książki kucharskiej. Oto ona:Moduł rejestrujący python nie zapisuje niczego do pliku

logger = logging.getLogger('server_logger') 
logger.setLevel(logging.DEBUG) 
# create file handler which logs even debug messages 
fh = logging.FileHandler('server.log') 
fh.setLevel(logging.DEBUG) 
# create console handler with a higher log level 
ch = logging.StreamHandler() 
ch.setLevel(logging.ERROR) 
# create formatter and add it to the handlers 
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S') 
ch.setFormatter(formatter) 
fh.setFormatter(formatter) 
# add the handlers to logger 
logger.addHandler(ch) 
logger.addHandler(fh) 

Ten kod loguje się idealnie do konsoli, ale nic nie jest rejestrowane w pliku. Plik jest tworzony, ale nic nie jest do niego zapisywane. Próbowałem zamknąć program obsługi, ale to nic nie robi. Ani go nie spłukuje. Przeszukałem Internet, ale najwyraźniej jestem jedynym z tym problemem. Czy ktokolwiek ma pojęcie o problemie? Dziękuję za odpowiedzi.

+0

Jakiego polecenia używasz do logowania? Czy dzwonisz po prostu 'logging.debug()'? – Leopd

+0

Używam logging.error() – thePurpleMonkey

+0

Brak repro dla mnie. Twój kod działa zgodnie z oczekiwaniami. – wim

Odpowiedz

16

Spróbuj zadzwonić

logger.error('This should go to both console and file') 

zamiast

logging.error('this will go to the default logger which you have not changed the config of') 
+1

Oh hej! To całkowicie sprawdziło się! Jesteś geniuszem! Chociaż nie do końca rozumiem, dlaczego to zadziałało ... – thePurpleMonkey

+5

dobre zdolności psychiczne – wim

+2

Wywołanie "logging.error" używa domyślnego programu rejestrującego, który nie został skonfigurowany. Zmienna 'logger' jest tą, którą zdefiniowałeś w pierwszym wierszu, który ma wszystkie skonfigurowane właściwości. – Leopd

1

Wiem, że to pytanie może być nieco zbyt stary, ale uważam, że powyższa metoda trochę overkill. Wpadłem na podobny problem, udało mi się go rozwiązać przez:

import logging 

logging.basicConfig(format = '%(asctime)s %(message)s', 
        datefmt = '%m/%d/%Y %I:%M:%S %p', 
        filename = 'example.log', 
        level=logging.DEBUG) 

To napisz do example.log wszystkie dzienniki, które są od poziomu debugowania lub wyższej.

logging.debug("This is a debug message") napisze This is a debug message do example.log. Poziom jest ważny, aby to zadziałało.

+1

Sądziłem również, że OP był nieco przesadny w stosunku do tego, co chciałem zrobić. Próbuję stworzyć kod, który działa, ale nie tworzy on dla mnie żadnego pliku, nie mówiąc już o jego zapisaniu. – Mymozaaa

+0

@Mymozaaa - https://docs.python.org/2/howto/logging.html#logging-to-a-file. Mam nadzieję, że to ci pomoże. –

1

Spróbuj umieścić import i basicConfig na samym początku skryptu. Coś takiego:

import logging 
logging.basicConfig(filename='log.log', level=logging.INFO) 
. 
. 
import ... 
import ...