Nie znalazłem jeszcze sposobu na skonfigurowanie logowania w Pythonie za pomocą Django, z którego jestem zadowolony. Moje wymagania są dość proste:
- Różne programy obsługi dziennika dla różnych zdarzeń - to znaczy chcę mieć możliwość logowania się do różnych plików
- Łatwy dostęp do rejestratorów w moich modułach. Moduł powinien być w stanie znaleźć swój rejestrator przy niewielkim wysiłku.
- Powinien być łatwy do zastosowania w modułach wiersza poleceń. Części systemu to samodzielne procesy wiersza poleceń lub demonów. Rejestrowanie powinno być łatwe w użyciu z tymi modułami.
Moja obecna konfiguracja polega na używaniu logging.conf
pliku i rejestrowania ustawień w każdym module, z którego się loguję. To nie jest w porządku.
Czy masz konfigurację logowania, którą lubisz? Proszę szczegółowo: jak logging.conf
ustawiasz konfigurację (używasz lub ustawiasz to w kodzie), gdzie / kiedy inicjujesz loggery i jak uzyskujesz do nich dostęp w swoich modułach itp.
Odpowiedzi:
Najlepszym sposobem, jaki znalazłem do tej pory, jest zainicjowanie konfiguracji logowania w settings.py - nigdzie indziej. Możesz użyć pliku konfiguracyjnego lub zrobić to programowo krok po kroku - zależy to tylko od Twoich wymagań. Najważniejsze jest to, że zazwyczaj dodaję programy obsługi, które chcę, do głównego loggera, używając poziomów, a czasem logowania. Filtry, aby pobrać zdarzenia, które chcę, do odpowiednich plików, konsoli, syslogów itp. Możesz oczywiście dodać programy obsługi do innych rejestratorów też, ale z mojego doświadczenia wynika, że nie ma takiej potrzeby.
W każdym module definiuję rejestrator za pomocą
i używaj tego do rejestrowania zdarzeń w module (a jeśli chcę dalej różnicować) użyj loggera, który jest dzieckiem loggera utworzonego powyżej.
Jeśli moja aplikacja ma być potencjalnie używana w witrynie, która nie konfiguruje logowania settings.py, definiuję NullHandler gdzieś w następujący sposób:
i upewnij się, że jego wystąpienie jest dodawane do wszystkich rejestratorów utworzonych w modułach moich aplikacji, które używają rejestrowania. (Uwaga: NullHandler jest już w pakiecie rejestrowania dla Pythona 3.1 i będzie w Pythonie 2.7.) Więc:
Ma to na celu zapewnienie, że twoje moduły będą dobrze działać w witrynie, która nie konfiguruje logowania settings.py, i że nie otrzymasz żadnych irytujących komunikatów "Nie znaleziono programów obsługi dla rejestratora XYZ" (które są ostrzeżeniami o potencjalnie źle skonfigurowane logowanie).
Zrobienie tego w ten sposób spełnia określone wymagania:
getLogger(__name__)
.settings.py
.Aktualizacja: Zauważ, że od wersji 1.3, Django zawiera teraz obsługę logowania .
źródło
foo
do zdarzenia uchwyt rejestrowanefoo.bar
. Re. ten wątek - zarówno fileConfig, jak i dictConfig mają teraz opcje zapobiegające wyłączaniu starych programów rejestrujących. Zobacz ten problem: bugs.python.org/issue3136 , który pojawił się kilka miesięcy po twoim problemie bugs.python.org/issue2697 - w każdym razie został rozwiązany od czerwca 2008 r.logger = someutils.getLogger(__name__)
skądsomeutils.getLogger
zwraca rejestrator zlogging.getLogger
już dodanym null_handler?NullHandler
dodany - zwykle jest to tylko rejestrator najwyższego poziomu dla twojej hierarchii pakietów. Więc to byłaby przesada, IMO.Wiem, że to już rozwiązana odpowiedź, ale zgodnie z django> = 1.3 jest nowe ustawienie logowania.
Przejście ze starego do nowego nie jest automatyczne, więc pomyślałem, że zapiszę to tutaj.
I oczywiście sprawdź dokumentację django, aby uzyskać więcej informacji.
To jest podstawowa konfiguracja, utworzona domyślnie za pomocą django-admin createproject v1.3 - przebieg może się zmienić w najnowszych wersjach django:
Ta struktura jest oparta na standardowym dzienniku Python dictConfig , który dyktuje następujące bloki:
formatters
- odpowiednią wartością będzie dict, w którym każdy klucz jest identyfikatorem programu formatującego, a każda wartość to dykt opisujący, jak skonfigurować odpowiednią instancję programu Formatter.filters
- odpowiednią wartością będzie dict, w którym każdy klucz jest identyfikatorem filtru, a każda wartość to dykt opisujący, jak skonfigurować odpowiednią instancję filtru.handlers
- odpowiednią wartością będzie dict, w którym każdy klucz jest identyfikatorem programu obsługi, a każda wartość jest dictem opisującym, jak skonfigurować odpowiednią instancję programu Handler. Każdy program obsługi ma następujące klucze:class
(obowiązkowy). To jest w pełni kwalifikowana nazwa klasy obsługi.level
(opcjonalny). Poziom przewodnika.formatter
(opcjonalny). Identyfikator programu formatującego dla tego programu obsługi.filters
(opcjonalny). Lista identyfikatorów filtrów dla tego modułu obsługi.Zwykle robię przynajmniej to:
Co przekłada się na:
edytować
Zobacz wyjątki żądań są teraz zawsze rejestrowane, a numer biletu 16288 :
Zaktualizowałem powyższą przykładową konfigurację, aby wyraźnie uwzględnić poprawny filtr dla administratorów poczty, aby domyślnie wiadomości e-mail nie były wysyłane, gdy debugowanie ma wartość True.
Powinieneś dodać filtr:
i zastosuj go do programu obsługi mail_admins:
W przeciwnym razie
django.core.handers.base.handle_uncaught_exception
nie przekazuje błędów do programu rejestrującego „django.request”, jeśli settings.DEBUG ma wartość True.Jeśli nie zrobisz tego w Django 1.5, otrzymasz plik
ale to nadal będzie działać poprawnie ZARÓWNO w django 1.4 i django 1.5.
** koniec edycji **
To conf jest silnie inspirowane przykładowym conf w dokumencie django, ale dodaje część pliku dziennika.
Często też wykonuję następujące czynności:
Następnie w moim kodzie Pythona zawsze dodaję NullHandler na wypadek, gdyby w ogóle nie została zdefiniowana konfiguracja logowania. Pozwala to uniknąć ostrzeżeń dla nieokreślonego programu obsługi. Szczególnie przydatne dla bibliotek, które niekoniecznie są wywoływane tylko w Django ( ref )
[…]
Mam nadzieję że to pomoże!
źródło
Rejestrowanie na najwyższym poziomie inicjalizujemy
urls.py
za pomocąlogging.ini
pliku.Lokalizacja
logging.ini
jest podana wsettings.py
, ale to wszystko.Wtedy każdy moduł to robi
Aby odróżnić instancje testowe, programistyczne i produkcyjne, mamy różne pliki logging.ini. W większości przypadków mamy „dziennik konsoli”, który trafia na stderr tylko z błędami. Mamy „dziennik aplikacji”, który używa zwykłego kroczącego pliku dziennika, który trafia do katalogu dzienników.
źródło
Obecnie używam systemu logowania, który sam stworzyłem. Używa formatu CSV do logowania.
django-csvlog
Ten projekt nadal nie ma pełnej dokumentacji, ale pracuję nad tym.
źródło