2011-11-08 11 views
19

Chcę sprawdzić błędy w konkretnym pliku tła, ale standardowy strumień błędów jest kontrolowany przez program na pierwszym planie, a błędy w pliku w pytaniu nie są są wyświetlane. Mogę jednak używać modułu logging i zapisywać dane wyjściowe do pliku. Zastanawiam się, w jaki sposób mogę użyć tego do rejestrowania wszystkich wyjątków, błędów i ich śledzenia.Korzystanie z modułu logowania Pythona do rejestrowania wszystkich wyjątków i błędów

+0

Możliwy duplikat [Logging niezłapane wyjątki w Python] (http://stackoverflow.com/questions/6234405/logging-uncaught-exceptions-in-python) –

Odpowiedz

40

To chyba zły pomysł, aby zalogować każdy wyjątek wyrzucony w programie, ponieważ Python używa wyjątków również do normalnego przepływu sterowania.

Dlatego należy rejestrować tylko wyjątki od niezatłoczonych. Możesz to łatwo zrobić za pomocą logger'a exception() method, gdy masz obiekt wyjątku.

Aby obsłużyć wszystkie przechwycone wyjątki, można owinąć punkt wejścia twojego skryptu w try...except bloku, albo przez zainstalowanie niestandardowej obsługi wyjątku przez ponowne przypisanie sys.excepthook():

import logging 
import sys 

logger = logging.getLogger('mylogger') 
# Configure logger to write to a file... 

def my_handler(type, value, tb): 
    logger.exception("Uncaught exception: {0}".format(str(value))) 

# Install exception handler 
sys.excepthook = my_handler 

# Run your main script here: 
if __name__ == '__main__': 
    main() 
+0

Dzięki! Dokładnie tego potrzebowałem. –

+0

Czy to nie jest dobry pomysł, aby dodać 'sys .__ excepthook __ (type, value, tb)' do 'my_handler', aby mógł on przetworzyć domyślne akcje na wyjątku? – troyane

+2

@Ferdinand Beyer: Schludny. Mając 'logger.exception (" Uncaught exception: {0}: {1} "format (str (wartość .__ klasa __.__ name__), str (wartość)))' daje w moim przypadku 'ERROR - Uncaught wyjątek: IndexError: list indeks poza zakresem' i drukuje z jakiegoś powodu 'Brak'. W jaki sposób mogę uzyskać pełne informacje zwrotne? 'tb' wydaje się być obiektem traceback, ale' traceback.print_tb (tb) 'również wypluwa' None'. – bioslime

Powiązane problemy