Amandasaurus
Amandasaurus

Reputation: 60699

Store Django Log messages in a database?

Django (the python web framework) uses python's logging system to store logs.

Is there an easy way to store log messages in a database, and then allow admin users to look over them via the web? It's the sort of thing I could write myself, but no point re-inventing the wheel. I don't want to log exceptions, but info/debug/notice type messages that I have added to the code.

Ideally I'd like to be able to store metadata about the log message as it's done (like the remote IP address, user agent, wsgi process id, etc.), and then filter / browse based on that (i.e. show me all log messages from this IP address in the last 24 hours). Has anyone done this?

Upvotes: 22

Views: 21177

Answers (5)

suark_krab
suark_krab

Reputation: 182

Try django-request. I've tried it and it basically just puts the request logs in a table called request_request.

It also includes important information like logged-in user. And it takes three lines of code to integrate (requirements.txt or Pipfile, INSTALLED_APPS and MIDDLEWARE).

Upvotes: 2

Sam Aghamohammdi
Sam Aghamohammdi

Reputation: 359

You can check a good solution that I posted here. You just need a string-connection to connect to your database. For example, if you use a MySQL, the connection-string should be:

# mysqlclient
'mysql+mysqldb://username:password@host:port/database'

or

# PyMySQL
'mysql+pymysql://username:password@host:port/database')

then you can use PhpMyAdmin as a "MySQL web administration tool" to look over the database via web browsers or DataGrip (my preference) to access any database remotely.


for using the handler in Django you just need to add the handler class to the LOGGING variable of setting.py as follow:

level = 'INFO' if DEBUG else 'WARNING'  # I prefer INFO in debugging mode and WARNING in production
handler = ['log_db_handler', ]  # In production I rarely check the server to see console logs
if DEBUG:
    handler.append('console')

LOGGING = {'version': 1,
           'disable_existing_loggers': False,

           'formatters': {'verbose': {'format': '{levelname} {message}',  # {asctime} {module} {process:d} {thread:d}
                                      'style': '{', }, },

           'handlers': {'log_db_handler': {'level': level,
                                           'class': 'db_logger.handlers.DBHandler',
                                           'formatter': 'verbose', },
                        'console': {'class': 'logging.StreamHandler', }},

           'loggers': {'db_log': {'handlers': handler,
                                  'level': level,
                                  'propagate': False, },
                       'django': {'handlers': handler,
                                  'level': level,
                                  'propagate': True, },
                       'django.request': {'handlers': handler,
                                          'level': level,
                                          'propagate': True, }}}

Pay attention that the 'db_logger.handlers.DBHandler' points to the handler class.

Upvotes: 0

Khachatur
Khachatur

Reputation: 989

check django-db-logger

it takes less than a minute to integrate

https://github.com/CiCiUi/django-db-logger

Upvotes: 6

Chris Pratt
Chris Pratt

Reputation: 239270

Just use Sentry. Raven, the Django piece of the functionality hooks into the logging framework, so in addition to collecting errors from your app, any custom log messages should show up as well.

Upvotes: 14

Wtower
Wtower

Reputation: 19902

Apart from the obvious choice of Sentry, for the sake of exercise, there is a nice blog article titled "Creating custom log handler that logs to database models in django" in the "James Lin Blog", which briefly explains how to do this using a second database, with code samples.

The code is adapted from the standard Python RotatingFileHandler:

...The RotatingFileHandler allows you to specify which file to write to and rotate files, therefore my DBHandler should also allow you to specify which model to insert to and specify expiry in settings, and best of all, on a standalone app.

This could also be easily adapted for using a single db.

Upvotes: 10

Related Questions