2010-11-10 11 views
20

gdzieś w czeluściach mojego kodu mam coś takiego:rejestrowanie hierarchii vs. program rejestrujący root?

logger = logging.getLogger('debug0.x') 

Tak jak ja to rozumiem, to powinien tylko reaguje wcześniej zrobić coś takiego:

logging.basicConfig(filename='10Nov2010a.txt',level=logging.DEBUG, name='debug0') 

zauważyć, że nazwa została zdefiniowana jako debug0. Jednak odkryłem, że jeśli zrobić

logging.basicConfig(filename='10Nov2010a.txt',level=logging.DEBUG) 

bez nazwa słów kluczowych, a następnie debug0.x rejestrator określono powyżej reaguje i zapisuje w pliku dziennika. Myślałem, że zareaguje tylko w pierwszym przypadku, gdy rejestrator został nazwany.

Jestem zdezorientowany.

+3

['logging.basicConfig()'] (http://docs.python.org/library/logging.html#logging.basicConfig) nie ma argumentu "nazwa_adresu" słowa kluczowego. –

Odpowiedz

52

Python moduł logging organizuje rejestratora w hierarchii. Wszystkie rejestratory są potomkami root loggera. Każdy rejestrator przekazuje wiadomości dziennika do swojego rodzica.

Nowe rejestratory są tworzone przy użyciu funkcji getLogger(). Wywołanie funkcji logging.getLogger('debug0.x') tworzy rejestrator x, który jest dzieckiem o numerze debug0, który sam jest dzieckiem głównego rejestratora. Podczas logowania do tego rejestratora przekazuje wiadomość do rodzica, a jej rodzic przekaże wiadomość do głównego programu rejestrującego. Skonfigurowałeś program rejestrujący root, aby logował się do pliku za pomocą funkcji basicConfig(), więc twoja wiadomość skończy się na tym.

+0

Jaka jest najlepsza praktyka uzyskiwania rejestratora w Pythonie? W Javie po prostu wykonaj 'getLogger (getClass(). GetName())' (lub pewną wygodną metodę 'getLogger (getClass())', która deleguje do drugiej metody, o której wspomniałem). Czego powinniśmy używać w Pythonie? Na pewno nie musimy tworzyć identyfikatora rejestratora i ręcznie go podłączać do każdego tworzonego modułu. –

+2

@Garret Najczęstszym podejściem w Pythonie jest użycie 'logger = logging.getLogger (__ name __) 'u góry każdego modułu. Zmienna "__name__" zawiera kropkowaną nazwę bieżącego modułu. –

+1

Jaki jest powód, dla którego najlepszą praktyką nie jest używanie '_logger', aby zmienna nie była widoczna podczas importowania modułu? –

10

Jeśli sprawdzić kod lub Doc:

>>> print logging.basicConfig.__doc__ 

    Do basic configuration for the logging system. 

    This function does nothing if the root logger already has handlers 
    configured. ............... 
    A number of optional keyword arguments may be specified, which can alter 
    the default behaviour. 

    filename Specifies that a FileHandler be created, using the specified 
       filename, rather than a StreamHandler. 
    filemode Specifies the mode to open the file, if filename is specified 
       (if filemode is unspecified, it defaults to 'a'). 
    format Use the specified format string for the handler. 
    datefmt Use the specified date/time format. 
    level  Set the root logger level to the specified level. 
    stream Use the specified stream to initialize the StreamHandler. Note 
       that this argument is incompatible with 'filename' - if both 
       are present, 'stream' is ignored. 

logging.basicConfig nie używać nazwy argumentu w ogóle. Inicjuje program rejestrujący root. Choć getLogger bierze „nazwa” argumentu

>>> print logging.getLogger.__doc__ 

    Return a logger with the specified name, creating it if necessary. 

    If no name is specified, return the root logger.