Logowanie wyjątków i zdarzeń z projektów Django do Sentry
sentry to coś w rodzaju agregatora logów. W przypadku projektów Django używamy go do logowania wyjątków jak i innych informacji pisanych przez nasz kod do logów. Zamiast wysyłać maila z wyjątkiem do administratora wszystko zapisywane jest w sentry.
Sentry to aplikacja napisana w Django. Obsługuje logowanie z różnych frameworków, czy języków (nawet JavaScript). Aplikację można szybko odpalić lokalnie, odpalić na własnym serwerze, albo wykupić instancję na getsentry.
W tym artykule przedstawię jak odpalić Sentry lokalnie (np. do testów) i jak skonfigurować Django by logowało wszystko do Sentry.
Instalacja i konfiguracja Sentry
Instalacja jest prosta:Pod Ubuntu-pochodną nie miałem plików nagłówkowych Pythona (pakiet *-dev) co wyłożyło kompilację setproctitle
. Zainstalowanie libpython-all-dev
z repozytorium załatwiło sprawę. Dodatkowo obecne Sentry (0.5.5) nie jest kompatybilne z Django 1.5, więc jeżeli w systemie masz tą lub nowszą wersję to Sentry trzeba zainstalować w virtualenvie.
Jako platformę wybieramy ten język/framework, którego używamy i chcemy zintegrować z Sentry. W tym przypadku będzie to Django. Po stworzeniu pierwszego projektu Sentry wyświetli instrukcje podpięcia logowania wyjątków z Django. Nie powie jednak wszystkiego...
Konfiguracja projektów Django
Instalujemy ravena:RAVEN_CONFIG = {
'dsn': 'TUTAJ_DSN_PODANY_PO_STWORZENIU_PROJEKTU_W_SENTRY',
}
Logowanie wyjątków
Załóżmy że mamy widok, któremu zdarzy się rzucić wyjątkiem:from django.views import generic
class ExceptionView(generic.View):
def get(self, request, **kwargs):
raise ValueError('I don\'t like this value')
exception_view = ExceptionView.as_view()
Można kliknąć na wpis by zobaczyć szczegóły, w tym wyjątek, stacktrace, informacje o użytkowniku Django i parę innych danych.
Logowanie zdarzeń modułem logging
Moduł logging często jest wykorzystywany by logować jakieś zdarzenia, które np. nie powinny wystąpić (ale jak wystąpią to rzucenie wyjątkiem nie jest potrzebne). Oto prosty przykład:
import logging
from django import http
from django.views import generic
logger = logging.getLogger(__name__)
class LoggingView(generic.View):
def get(self, request, **kwargs):
logger.warning("An error")
return http.HttpResponse("ok")
logging_view = LoggingView.as_view()
class InheritingView(LoggingView):
pass
inheriting_view = InheritingView.as_view()
No handlers could be found for logger "myapp.views"
LOGGING = {
'version': 1,
'disable_existing_loggers': True,
'root': {
'level': 'DEBUG',
'handlers': ['sentry'],
},
'formatters': {
'verbose': {
'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
},
},
'handlers': {
'sentry': {
'level': 'DEBUG',
'class': 'raven.contrib.django.raven_compat.handlers.SentryHandler',
},
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'verbose'
}
},
'loggers': {
'django.db.backends': {
'level': 'ERROR',
'handlers': ['console'],
'propagate': False,
},
'raven': {
'level': 'DEBUG',
'handlers': ['console'],
'propagate': False,
},
'sentry.errors': {
'level': 'DEBUG',
'handlers': ['console'],
'propagate': False,
},
},
}
logger.warning("an error", extra={'request': request, 'stack': True})
requestładnie zaloguje cały obiekt request. Dodanie stack ustawionego na True spowoduje zapisanie stacktrace (co powie, np. który z widoków tak naprawdę wygenerował wpis). Zamiast wszędzie dodawać stack można w settingsach dodać:SENTRY_AUTO_LOG_STACKS = TrueLogowanie z zadań Celery
Żeby wyjątki z tasków Celery się logowany to musimy do LOGGING w settingsach do sekcji loggers dodać (level wedle uznania):Co obsłuży wyjątki, ale nie użycie loggera. Celery porywa logger i żeby działał z Sentry trzeba go pobrać tak:'celery': { 'level': 'WARNING', 'handlers': ['sentry'], 'propagate': False, },Gdzie "celery_task" to nazwa funkcji-taska Celery.from celery import task @task() def celery_task(): logger = celery_task.get_logger() logger.warning("celerrrrrrrrrry log")Żeby używać loggera
normalniemożna w settingsach dodać:CELERYD_HIJACK_ROOT_LOGGER = FalseGdy Celery
porywaloggera to wiadomości wysyłane przez ten moduł zobaczymy w konsoli Celery (django-admin.py celeryd -l info). Gdy wyłączymy porywanie to zobaczymy je w Sentry.RkBlog
Comment article