2013-07-08 14 views
10

Chcę użyć obsługi logowania StreamHandler z Pythona. To, czego próbowałem, to:Python: logging.streamhandler nie wysyła logów do stdout

import logging 
import sys 
mylogger = logging.getLogger("mylogger") 
h1 = logging.StreamHandler(stream=sys.stdout) 
h1.setLevel(logging.DEBUG) 

mylogger.addHandler(h1) 

# now trying to log with the created logger 
mylogger.debug("abcd") # <no output> 
mylogger.info("abcd") # <no output> 
mylogger.warn("abcd") # abcd 

Czy brakuje czegoś? Czy robisz coś złego? Dlaczego dzienniki poziomów INFO i DEBUG nie są wysyłane na STDOUT?

Odpowiedz

16

Musisz ustawić poziom rejestratorze nie tylko poziom obsługi:

mylogger.setLevel(logging.DEBUG) 

Oto miły graficzny z obiegu logowania, gdzie można zobaczyć, że albo rejestrator i obsługi sprawdzić poziom dziennika:

http://docs.python.org/2/howto/logging.html#logging-flow

domyślna logLevel jest WARNING, więc nawet jeśli ustawić poziom swojego przewodnika do DEBUG, komunikat nie będzie przez, ponieważ twój program rejestrujący je pomija (domyślnie jest to także WARNING).

Nawiasem mówiąc, można zrobić pewne podstawowe formatowanie z Formatter:

import logging 
import sys 

mylogger = logging.getLogger("mylogger") 

formatter = logging.Formatter('[%(levelname)s] %(message)s') 

handler = logging.StreamHandler(stream=sys.stdout) 
handler.setFormatter(formatter) 
handler.setLevel(logging.DEBUG) 

mylogger.addHandler(handler) 
mylogger.setLevel(logging.DEBUG) 

mylogger.debug("This is a debug message.") 
mylogger.info("Some info message.") 
mylogger.warning("A warning.") 

daje wyświetlamy

[DEBUG] This is a debug message. 
[INFO] Some info message. 
[WARNING] A warning. 
+0

byłem po kilka podstawowych dokumentów http: //docs.python. org/2/howto/logging.html # logging-advanced-tutorial Doc mówi setLevel na handler. Czy ten dokument jest niewłaściwy? –

+2

Nie, nie jest źle, jak widać w http://docs.python.org/2/howto/logging.html#logging-flow logger przekazuje wywołanie rejestrowania do jego obsługi po sprawdzeniu poziomu. Więc jeśli poziom rejestratora jest ustawiony na 'WARN' i nadchodzi komunikat' DEBUG', nic się nie przedostanie. Jeśli wiadomość zostanie przesłana, program rejestrujący przekazuje ją do programu obsługi, który również ma typ rejestrowania "filtr". – tamasgal

+0

Dlaczego muszę ustawić poziom rejestratora, jeśli ustawiłem poziom obsługi? dlaczego ustawienie dwa razy? to wydaje się zbędne. – ospider