2012-03-25 7 views
9

Moduł rejestrowania w Pythonie pozwala modułom lub klasom zdefiniować własne rejestratory. Różne rejestratory mogą mieć różne procedury obsługi. Niektóre z nich mogą logować się do pliku, a niektóre z nich logują się, na przykład, stdout.Jak skonfigurować wszystkie rejestratory w aplikacji?

Teraz moja aplikacja używa kilku z tych modułów, każdy z własnym rejestratorem, który ma różne procedury obsługi. Czy mogę ujednolicić zachowanie rejestrowania, aby wszystkie dzienniki były przesyłane do określonego pliku dziennika? Innymi słowy, czy istnieje sposób na .config() wszystkich programów obsługi rejestratorów naraz, z jednego miejsca?

Odpowiedz

10

Powinieneś zajrzeć do Python Logging HOWTO, aby zrozumieć, jak to działa.

Krótko mówiąc, wszystkie te moduły zwykle robią to rejestrator formularza G_LOG = logging.getLogger('package.name') i wysyłanie wiadomości do rejestratora: G_LOG.info('some message'), G_LOG.exception('something bad happened'). Moduły zwykle nie powinny konfigurować niczego.

Aplikacja, która wykorzystuje moduły można włączyć rejestrowanie i konfigurowanie koparki na podstawie nazw Rejestrator:

  • słuchają wszystkie wiadomości, lub
  • tylko słuchać wiadomości powyżej pewnego progu, lub
  • słuchać wiadomości tylko z rejestratorów, których nazwa zaczyna się package lub
  • słuchać wiadomości tylko z rejestratorów, których nazwa zaczyna stac package.name itp

Najprostszym sposobem jest skonfigurować rejestrowanie poprzez logging.basicConfig gdzieś na początku swojej aplikacji:

logging.basicConfig(level=logging.DEBUG, 
        format='%(asctime)s %(levelname)-8s %(message)s', 
        datefmt='%Y-%m-%d %H:%M:%S', 
        filename=log_file, filemode='a') 

ten sposób można napisać wszystkie wiadomości z logowaniem ze wszystkich modułów do log_file.

Aby uzyskać bardziej szczegółową strategię rejestrowania (umieścić dzienniki z różnych rejestratorów w różnych plikach lub wysłać stosy do oddzielnego pliku), lepiej jest zdefiniować plik konfiguracyjny rejestrowania i skonfigurować rejestrowanie przy użyciu logging.config.dictConfig lub logging.config.fileConfig.

P.S. I zazwyczaj utworzyć dwa rejestratory jako zmienne Moduł:

G_LOG = logging.getLogger(__name__) 
ST_LOG = logging.getLogger('stacktrace.' + __name__) 

do G_LOG ja wysyłał wiadomości tylko jedna linia. Do ST_LOG Powielam ważne wiadomości, używając ST_LOG.exception, która domyślnie ma exc_info=True i zapisuje stos bieżącego wyjątku.

Na początku stosowania załadować konfigurację, która konfiguruje dwa rejestratory (i dwie koparki plików dla nich): jeden, który odbiera wiadomości, które zaczynają się stacktrace i ma propagate=0 (czyli StackTrace wiadomości nie są widoczne u góry) i dziennik główny, który obsługuje pozostałe wiadomości. Nie będę tutaj umieszczał moich pełnych plików konfiguracyjnych dziennika, ponieważ jest to przydatna praca domowa, aby zrozumieć, jak to wszystko działa.

+1

Uwielbiam pomysł stacktrace, który tu masz, ale nienawidzę twojej pozycji "Nie umieszczę tutaj moich pełnych logicznych plików konfiguracyjnych". Piszę od 10 lat i nadal loguję się bardzo słabo z powodu tego, jak straszna jest dokumentacja. Kilka razy w roku inwestuję całe dni pracy, próbując znaleźć coś lepszego. Zwykle rezygnuję i zgadzam się na coś, co zrobiłem w przeszłości. –

+0

@BrunoBronosky, prawdopodobnie masz rację. To dobry pomysł. – newtover

Powiązane problemy