diff --git a/README.rst b/README.rst index 61b9f52..e66eb98 100644 --- a/README.rst +++ b/README.rst @@ -97,6 +97,43 @@ Options 1. DJANGO_DB_LOGGER_ADMIN_LIST_PER_PAGE: integer. list per page in admin view. default ``10`` 2. DJANGO_DB_LOGGER_ENABLE_FORMATTER: boolean. Using ``formatter`` options to format message. ``True`` or ``False``, default ``False`` + +Define your own behaviour to log additional details: +---------------------------------------------------- +Extend the ``DatabaseLogHandler`` to add your own configurations and functionality to the ``add_details`` method: + +.. code-block:: python + + # my_log_handlers.py + from django_db_logger.db_log_handler import DatabaseLogHandler + + class MyDatabaseLogHandler(DatabaseLogHandler): + def add_details(self, record, log_fields): + """ + Extract relevant details from the record's request: + * request path + * used HTTP method + * used GET params (within URL) + """ + request = getattr(record, 'request', None) + if request: + log_fields['details'] = { + 'path': getattr(request, 'path', None), + 'method': getattr(request, 'method', None), + 'params': getattr(request, 'GET', None), + } + + +And make sure to use your own class in the logging configuration: +.. code-block:: python + + # settings.py + LOGGING["handlers"]["db_log"] = { + "class": "my_project.my_log_handlers.MyDatabaseLogHandler", + "level": "DEBUG", + } + + Build your own database logger :hammer: --------------------------------------- 1. Create a new app and add it to ``INSTALLED_APPS`` @@ -104,4 +141,4 @@ Build your own database logger :hammer: 3. Replace ``DJANGO_DB_LOGGER_ADMIN_LIST_PER_PAGE`` in ``admin.py`` with an integer 4. Replace ``DJANGO_DB_LOGGER_ENABLE_FORMATTER`` in `db_log_handler.py` with ``True`` or ``False``. Remove ``MSG_STYLE_SIMPLE``, it was not used. 5. Replace logger class ``django_db_logger.db_log_handler.DatabaseLogHandler`` in your Settings with the new logger class -6. Customize the looger to meet your needs. :beer: +6. Customize the logger to meet your needs. :beer: diff --git a/dev_env/settings.py b/dev_env/settings.py index 0f4ad2c..086f448 100644 --- a/dev_env/settings.py +++ b/dev_env/settings.py @@ -42,16 +42,19 @@ 'simple': { 'format': '%(levelname)s %(asctime)s %(message)s' }, + 'message_only': { + 'format': '%(message)s' + } }, 'handlers': { 'db_handler': { 'level': 'DEBUG', 'class': 'django_db_logger.db_log_handler.DatabaseLogHandler', - 'formatter': 'verbose' + 'formatter': 'message_only' } }, 'loggers': { - 'db': { + 'db_logger': { 'handlers': ['db_handler'], 'level': 'DEBUG' } @@ -116,4 +119,4 @@ USE_L10N = True -USE_TZ = True +USE_TZ = True \ No newline at end of file diff --git a/django_db_logger/db_log_handler.py b/django_db_logger/db_log_handler.py index 86f48f2..259c476 100644 --- a/django_db_logger/db_log_handler.py +++ b/django_db_logger/db_log_handler.py @@ -1,7 +1,6 @@ import logging -from django_db_logger.config import DJANGO_DB_LOGGER_ENABLE_FORMATTER, MSG_STYLE_SIMPLE - +from django_db_logger.config import DJANGO_DB_LOGGER_ENABLE_FORMATTER db_default_formatter = logging.Formatter() @@ -9,7 +8,7 @@ class DatabaseLogHandler(logging.Handler): def emit(self, record): from .models import StatusLog - + trace = None if record.exc_info: @@ -27,6 +26,9 @@ def emit(self, record): 'trace': trace } + # extract relevant log details from the record + self.add_details(record, kwargs) + StatusLog.objects.create(**kwargs) def format(self, record): @@ -46,3 +48,9 @@ def format(self, record): return fmt.formatMessage(record) else: return fmt.format(record) + + def add_details(self, record, log_fields): + """ + Add the record's relevant details to the log_fields + """ + pass diff --git a/django_db_logger/migrations/0003_statuslog_details.py b/django_db_logger/migrations/0003_statuslog_details.py new file mode 100644 index 0000000..b0b3026 --- /dev/null +++ b/django_db_logger/migrations/0003_statuslog_details.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.12 on 2022-02-16 14:46 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('django_db_logger', '0002_auto_20190109_0052'), + ] + + operations = [ + migrations.AddField( + model_name='statuslog', + name='details', + field=models.JSONField(help_text='Additional info about the log (e.g. GET request path and query params).', null=True, verbose_name='details'), + ), + ] diff --git a/django_db_logger/models.py b/django_db_logger/models.py index c8b0a6c..31ff0b9 100644 --- a/django_db_logger/models.py +++ b/django_db_logger/models.py @@ -20,6 +20,12 @@ class StatusLog(models.Model): msg = models.TextField() trace = models.TextField(blank=True, null=True) create_datetime = models.DateTimeField(auto_now_add=True, verbose_name='Created at') + details = models.JSONField( + _("details"), + help_text=_("Additional info about the log (e.g. GET request path and query params)."), + blank=False, + null=True, + ) def __str__(self): return self.msg