2013-03-28 38 views
5

Mam prosty projekt python (non-Django), gdzie próbuję tie Raven into the logging setup.Raven's SentryHandler tłumi wyjście StreamHandler do pliku

ramach naszej aktualnej konfiguracji, używamy prostego rejestrowania config:

import logging 
logging.basicConfig(format='long detailed format', 
        level=logging.DEBUG) 

Wyjście zostaje przekierowane do pliku dziennika; w ten sposób powstaje miły, szczegółowy log, który możemy przejrzeć, kiedy zajdzie taka potrzeba.

Teraz chcemy dodać rejestrowanie błędu Raven, wiążąc je do naszej aktualnej konfiguracji rejestrowania tak że logging.error wzywa również wynik w wiadomości wysyłane do serwera Sentry. Stosując następujący kod:

from raven import Client 
from raven.conf import setup_logging 
from raven.handlers.logging import SentryHandler 

raven = Client(environ.get('SENTRYURL', ''), site='SITE') 
setup_logging(SentryHandler(raven, level=logging.ERROR)) 

Błędy są z powodzeniem wysłane do Sentry, ale mam teraz tylko coraz pojedynczą linię wyjścia pliku:

DEBUG: Configuring Raven for host: <DSN url> 

Wszystkie inne wyjścia plik - od logging.debug do logging.error - jest tłumiony.

Jeśli skomentuję linię setup_logging, otrzymam wynik pliku, ale nie wystąpi błąd Sentry. Co ja robię źle?

Odpowiedz

3

Okazało się, że jest to przypadek niechlujstwa kodu. Mieliśmy trochę włamać gdzie indziej w ścieżce wykonywania startowy, który ponownie inicjowane rejestrowanie:

logging.root.removeHandler(logging.root.handlers[0]) # Undo previous basicConfig 
logging.basicConfig(format='same long format', 
        level=logging.DEBUG) 

Jednak od logging.basicConfig nic nie robi jeśli logging.root ma istniejące teleskopowe, to po prostu usunął obsługi strumienia, pozostawiając obsługi wartownika i spowodował, że basicConfig działał jako no-op, co oznacza, że ​​całkowicie straciliśmy nasz StreamHandler.

Usunięcie tych linii i wykonanie tylko jednego połączenia basicConfig i setup_logging zadziałało.