2013-06-14 14 views
7

Dla mojego pierwszego doświadczenia z logowaniem w Pythonie (2.7) tworzę podstawowy moduł rejestrowania, który szybko utworzy rejestrator dla (więc nie będę musiał go konfigurować na moduł /klasa).Rejestrowanie w języku Python: wyświetlanie tylko informacji z poziomu debugowania

Co chcę zrobić, to stworzyć program rejestrujący, który wyświetla wszystkie komunikaty o poziomie INFO i wyższym na konsoli i przenosi wszystkie informacje o poziomie DEBUG do pliku tekstowego.

Do tej pory utworzyłem program rejestrujący, który drukuje INFO i do konsoli, i który drukuje wszystkie komunikaty dziennika do pliku tekstowego. Jednak nie chcę wszystkich wiadomości INFO i wyższych w moim pliku tekstowym.

Zrobiłem Python Fiddle, który przechowuje mój kod.

użyłem następujące komunikaty debugowania z samouczka:

log.debug('All systems operational') 
log.info('Airspeed 300 knots') 
log.warn('Low on fuel') 
log.error('No fuel. Trying to glide.') 
log.critical('Glide attempt failed. About to crash.') 

który z produktów konsoli:

[INFO] root: Airspeed 300 knots 
[WARNING] root: Low on fuel 
[ERROR] root: No fuel. Trying to glide. 
[CRITICAL] root: Glide attempt failed. About to crash. 

aw moim pliku debug_log.txt:

2013-06-14 14:51:46,963:DEBUG:root:All systems operational 
2013-06-14 14:51:46,964:INFO:root:Airspeed 300 knots 
2013-06-14 14:51:46,964:WARNING:root:Low on fuel 
2013-06-14 14:51:46,964:ERROR:root:No fuel. Trying to glide. 
2013-06-14 14:51:46,964:CRITICAL:root:Glide attempt failed. About to crash. 

W powyższy blok, te ostatnie cztery linie nie powinny znajdować się w pliku. Czy to, co próbuję zrobić, jest możliwe i jak uzyskać pożądany rezultat?

Odpowiedz

11

Musisz utworzyć własną handler object.

Z dokumentacji: Klasa FileHandler, znajdująca się w pakiecie rdzenia logowania, wysyła wyniki rejestrowania do pliku na dysku. Dziedziczy funkcje wyjściowe z StreamHandler. Więc tutaj chodzi o rozszerzenie klasy FileHandler, aw metodzie emit() odfiltrowanie wszystkich obiektów record, które nie są na poziomie record.

Nie testowałem tego, ale myślę, że to wykonać zadanie:

from logging import FileHandler, DEBUG 
log = logging.getLogger('foo') 

class DebugFileHandler(FileHandler): 
    def __init__(self, filename, mode='a', encoding=None, delay=False) 
     FileHandler.__init__(self, filename, mode, encoding, delay) 

    def emit(self, record): 
     if not record.levelno == DEBUG: 
      return 
     FileHandler.emit(self, record) 

log.addHandler(DebugFileHandler()) 

Oczywiście, trzeba będzie dostosować ten kod do kodu. I, szczerze mówiąc, record.level to szalone przypuszczenie, ale myślę, że ma sens :-) I, I got it right!

W tym przykładzie program obsługi zostanie zastosowany tylko dla rejestratora foo. Możesz go aktywować dla swojego głównego programu obsługi lub tylko dla niektórych programów obsługi, jak być może wolisz.

+1

Tutaj właśnie napisałem :-) – zmo

+1

Dziękuję, muszę sprawdzić, jaki kod działa dokładnie, ale dzięki tym informacjom się tam dostanę. :) –

+1

Dla przyszłych referencji, myślę, że miło jest zwrócić uwagę na następujące: Powyższy kod działa głównie. Na końcu klasy brakuje niektórych dwukropków, ale są one łatwe do wykrycia. Jeśli zastąpisz wiersz 'if record.level! = DEBUG:' z 'if not record.levelno == DEBUG:', wszystkie logi inne niż DEBUG są ładnie odfiltrowane. –

Powiązane problemy