Sử dụng Sentry để log exceptions và logging messages trong Django

Sentry là một ứng dụng để log lại bản ghi sử dụng để log exceptions và message trong Django. Để tìm hiểu thêm về Sendtry các bạn có thể tìm hiểu thêm về cài đặt và source code trên doc. Sentry thường đuọc sử dụng để log và thông báo lỗi trên server Python. Hôm nay tôi sẽ hướng dẫn thiết lập sentry để log exception và hỗ trợ celery trên máy local giúp các bạn hiểu cách cài đặt và hoạt động ném exception của sendtry.
1. Cài đặt và thiết lập sendtry
Cài đặt thông qua pip:
pip install sentry

Sau khi cài đặt hoàn thành, để generate các thiết lập của sendtry:

sentry init conf.py

Khi có lỗi sendtry sẽ gửi lỗi về thông qua email. Chúng ta có thể thay đổi thiết lập EMAIL_BACKEND của sendtry để ném ra exception khi gửi mail lỗi.

EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

Để tạo database cho ứng dụng:

sentry --config=conf.py upgrade

Sau đó là có thể khởi chạy ứng dụng:

sentry --config=conf.py start

chuyển tới trang http://localhost:9000 để đăng kí vào tạo log đầu tiên cho project:

sentry1.png Đăng kí 1 team để tạo log đầu tiên:
thumb_sentry2.png

2.Config Django
And that's all you have to do to log exceptions from a Django project. When the Sentry is running any exception thrown in Django will be logged. If your code uses Python logging module (directly or indirectly) or it has Celery tasks then you will have to add some more configuration. Đến đây sendtry đã tự động log được các exceptions từ 1 django project. Nếu trong project của bạn sử dụng Celery task thì bạn sẽ phải add thêm vào config:
Dưới đây là 1 ví dụ code test chạy thử log đầu tiên Django:

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()

![thumb_sentry3.png](/uploads/64be7c49-bd07-4c80-8a9f-5a054990416d.png)

Khi ứng dụng có exception Sentry sẽ tự động ghi log về nó và gửi xuống cho chúng ta:
thumb_sentry4.png

3.Logging từ Celery Task
Ngoài ra chúng ta có thể log từ các module log khác của django. dưới đây là 1 ví dụ log từ module log:

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()

Trong Settings của Django ta cấu hình:

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,
        },
    },
}

Nó sẽ tự động log mọi thứ và gửi cho sendtry:

thumb_sentry7.png

Để Log các task chạy bên dưới Celery ta sẽ thêm logger vào LOGGING ở config file:

'celery': {
    'level': 'WARNING',
    'handlers': ['sentry'],
    'propagate': False,
},

Và cover hết các Exception:

from celery import task

@task()
def celery_task():
    logger = celery_task.get_logger()
    logger.warning("celerrrrrrrrrry log")

thumb_sentry8.png

Như vậy chúng ta đã tìm hiểu thiết lập 1 ứng dụng có thể ghi lại toàn bộ log cho ứng dụng Django. giúp cho ta dễ dàng quản lý lỗi exception, hay bất cứ sự kiện nào của server.