123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248 |
- --------------
- django-sentry
- --------------
- Sentry provides you with a generic interface to view and interact with your error logs. By
- default, it will catch any exception thrown by Django and store it in a database. With this
- it allows you to interact and view near real-time information to discover issues and more
- easily trace them in your application.
- * Note: Sentry has only been tested under a PostgreSQL environment.
- ==========
- Screenshot
- ==========
- .. image:: http://dl.dropbox.com/u/116385/sentry2.jpg
-
- ============
- Requirements
- ============
-
- - **Django >= 1.2** (to use a secondary database to store error logs)
- - **django-indexer** (stores metadata indexes)
- - **django-paging**
- - **pygooglechart** (to generate *optional* error reports)
- =========
- Upgrading
- =========
- If you use South migrations, simply run::
- python manage.py migrate sentry
- If you don't use South, then start.
- =======
- Install
- =======
- The easiest way to install the package is via pip::
- pip install django-sentry --upgrade
- OR, if you're not quite on the same page (work on that), with setuptools::
- easy_install django-sentry
- Once installed, update your settings.py and add ``sentry``, ``sentry.client``, ``indexer``, and ``paging`` to ``INSTALLED_APPS``::
- INSTALLED_APPS = (
- 'django.contrib.admin',
- 'django.contrib.auth',
- 'django.contrib.contenttypes',
- 'django.contrib.sessions',
-
- # don't forget to add the dependancies!
- 'indexer',
- 'paging',
- 'sentry',
- 'sentry.client',
- ...
- )
- Finally, run ``python manage.py syncdb`` to create the database tables.
- (If you use South, you'll need to use ``python manage.py migrate sentry``)
- ==========================
- Multi-server configuration
- ==========================
- To configure Sentry for use in a multi-server environment, first you'll want to configure your Sentry server (not your application)::
- INSTALLED_APPS = [
- ...
- 'indexer',
- 'paging',
- 'sentry',
- 'sentry.client',
- ]
-
- SENTRY_KEY = '0123456789abcde'
- And on each of your application servers, specify the URL of the Sentry server, add ``sentry.client`` to ``INSTALLED_APPS``, and specify the same key used in your Sentry server's settings::
- # This should be the absolute URI of sentries store view
- SENTRY_REMOTE_URL = 'http://your.sentry.server/sentry/store/'
-
- INSTALLED_APPS = [
- ...
- 'sentry.client',
- ]
-
- SENTRY_KEY = '0123456789abcde'
- You may also specify an alternative timeout to the default (which is 5 seconds) for all outgoing logging requests::
- SENTRY_REMOTE_TIMEOUT = 5
- Sentry also allows you to support high availability by pushing to multiple servers::
- SENTRY_REMOTE_URL = ['http://server1/sentry/store', 'http://server2/sentry/store']
- ===========================
- Other configuration options
- ===========================
- Several options exist to configure django-sentry via your ``settings.py``:
- #############
- SENTRY_ADMINS
- #############
- On smaller sites you may wish to enable throttled emails, we recommend doing this by first
- removing the ``ADMINS`` setting in Django, and adding in ``SENTRY_ADMINS``::
- ADMINS = ()
- SENTRY_ADMINS = ('root@localhost',)
- This will send out a notification the first time an error is seen, and the first time an error is
- seen after it has been resolved.
- #######################
- SENTRY_CATCH_404_ERRORS
- #######################
- Enable catching of 404 errors in the logs. Default value is ``False``::
- SENTRY_CATCH_404_ERRORS = True
- You can skip other custom exception types by adding a ``skip_sentry = True`` attribute to them.
- #####################
- SENTRY_DATABASE_USING
- #####################
- Use a secondary database to store error logs. This is useful if you have several websites and want to aggregate error logs onto one database server::
- # This should correspond to a key in your DATABASES setting
- SENTRY_DATABASE_USING = 'default'
- You should also enable the ``SentryRouter`` to avoid things like extraneous table creation::
- DATABASE_ROUTERS = [
- 'sentry.routers.SentryRouter',
- ...
- ]
- .. note:: This functionality REQUIRES Django 1.2.
- ############################
- Integration with ``logging``
- ############################
- django-sentry supports the ability to directly tie into the ``logging`` module. To use it simply add ``SentryHandler`` to your logger::
- import logging
- from sentry.client.handlers import SentryHandler
-
- logging.getLogger().addHandler(SentryHandler())
- # Add StreamHandler to sentry's default so you can catch missed exceptions
- logging.getLogger('sentry').addHandler(logging.StreamHandler())
- You can also use the ``exc_info`` and ``extra=dict(url=foo)`` arguments on your ``log`` methods. This will store the appropriate information and allow django-sentry to render it based on that information:
- logging.error('There was some crazy error', exc_info=sys.exc_info(), extra={'url': request.build_absolute_uri()})
- ##############
- SENTRY_TESTING
- ##############
- Enabling this setting allows the testing of Sentry exception handler even if Django DEBUG is enabled.
- Default value is ``False``
- .. note:: Normally when Django DEBUG is enabled the Sentry exception handler is immediately skipped
- ###########
- SENTRY_NAME
- ###########
- This will override the ``server_name`` value for this installation. Defaults to ``socket.get_hostname()``.
- =====
- Usage
- =====
- Set up a viewer server (or use your existing application server) and add sentry to your INSTALLED_APPS and your included URLs::
- # urls.py
- urlpatterns = patterns('',
- (r'^admin/', include(admin.site.urls)),
- (r'^sentry/', include('sentry.urls')),
- )
- Now enjoy your beautiful new error tracking at ``/sentry/``.
- ===
- API
- ===
- For the technical, here's some further docs:
- If you wish to access these within your own views and models, you may do so via the standard model API::
- from sentry.models import Message, GroupedMessage
-
- # Pull the last 10 unresolved errors.
- GroupedMessage.objects.filter(status=0).order_by('-last_seen')[0:10]
- You can also record errors outside of handler if you want::
- from sentry.client.base import SentryClient
-
- try:
- ...
- except Exception, exc:
- SentryClient.create_from_exception([url=None, view=None])
- If you wish to log normal messages (useful for non-``logging`` integration)::
- from sentry.client.base import SentryClient
- import logging
-
- SentryClient.create_from_text('Message Message'[, level=logging.WARNING, url=None])
- Both the ``url`` and ``level`` parameters are optional. ``level`` should be one of the following:
- * ``logging.DEBUG``
- * ``logging.INFO``
- * ``logging.WARNING``
- * ``logging.ERROR``
- * ``logging.FATAL``
- If you have a custom exception class, similar to Http404, or something else you don't want to log,
- you can also add ``skip_sentry = True`` to your exception class or instance, and sentry will simply ignore
- the error.
- =====
- Notes
- =====
- * sentry-client will automatically integrate with django-idmapper.
- * sentry-client supports South migrations.
- * The fact that the admin shows large quantities of results, even if there aren't, is not a bug. This is an efficiency hack on top of Django.
|