Skip to content

Make sure "create_datetime" is always visible; hide "Add" button from admin #11

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 9 commits into
base: master
Choose a base branch
from
Open
115 changes: 41 additions & 74 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -2,92 +2,59 @@
django-db-logger
================

.. image:: https://travis-ci.org/CiCiUi/django-db-logger.svg?branch=master
:target: https://travis-ci.org/CiCiUi/django-db-logger
I finally switched back to the original app https://github.com/CiCiUi/django-db-logger,
customizing StatusLogAdmin in the local Django project as follows:

Django logging in database.
For large projects please use `Sentry <https://github.com/getsentry/sentry>`_
.. code:: python

Screenshot
----------
.. image:: https://ciciui.github.io/django-db-logger/static/img/django-db-logger.png
:target: https://travis-ci.org/CiCiUi/django-db-logger
from django.contrib import admin
from django.utils.html import format_html
from django.utils import timezone
from django_db_logger.models import StatusLog
from django_db_logger.admin import StatusLogAdmin

Dependency
----------
* Django>=1.6
* Python 2.6+/3.3+
################################################################################
# Improved StatusLogAdmin

License
-------
MIT
class StatusLogAdminEx(StatusLogAdmin):
list_display = ('create_datetime_format', 'colored_msg', 'traceback', )
list_display_links = ('create_datetime_format', )
list_filter = ('create_datetime', 'level', )
readonly_fields = ['logger_name', 'level', 'msg', 'trace', ]
date_hierarchy = 'create_datetime'

Quick start
-----------
def create_datetime_format(self, instance):
return format_html(
'<span style="white-space: nowrap;">%s</span>' % \
timezone.localtime(instance.create_datetime).strftime('%Y-%m-%d %X')
)
create_datetime_format.short_description = 'Created at'

1. Install
def has_add_permission(self, request):
# Hide "Add" button from admin
return False

.. code-block:: bash
def has_change_permission(self, request, obj=None):
# Hide "Save" button from admin
return False

pip install django-db-logger
admin.site.unregister(StatusLog)
admin.site.register(StatusLog, StatusLogAdminEx)

2. Add "django_db_logger" to your ``INSTALLED_APPS`` setting like this

.. code-block:: python
The number of logged records can be limited with https://github.com/morlandi/django-tables-cleaner as follows:

INSTALLED_APPS = (
...
'django_db_logger',
)
.. code:: python

3. Add handler and logger to ``LOGGING`` setting like this

.. code-block:: python

LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
},
'simple': {
'format': '%(levelname)s %(asctime)s %(message)s'
},
},
'handlers': {
'db_log': {
'level': 'DEBUG',
'class': 'django_db_logger.db_log_handler.DatabaseLogHandler'
},
TABLES_CLEANER_TABLES = [
{
'model_name': 'django_db_logger.statuslog',
'keep_records': 1000,
'keep_since_days': 30,
'keep_since_hours': 0,
'get_latest_by': 'create_datetime',
},
'loggers': {
'db': {
'handlers': ['db_log'],
'level': 'DEBUG'
}
}
}

4. Run ``python manage.py migrate`` to create django-db-logger models.
5. Use ``django-db-logger`` like this

.. code-block:: python

import logging
db_logger = logging.getLogger('db')

db_logger.info('info message')
db_logger.warning('warning message')

try:
1/0
except Exception as e:
db_logger.exception(e)

]


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``
so DJANGO_DB_LOGGER_MAX_LOG_RECORDS is not required anymore.
16 changes: 13 additions & 3 deletions django_db_logger/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,19 @@

from django.contrib import admin
from django.utils.html import format_html
from django.utils import timezone

from django_db_logger.config import DJANGO_DB_LOGGER_ADMIN_LIST_PER_PAGE
from .models import StatusLog


class StatusLogAdmin(admin.ModelAdmin):
list_display = ('colored_msg', 'traceback', 'create_datetime_format')
list_display = ('create_datetime_format', 'colored_msg', 'traceback', )
list_display_links = ('colored_msg', )
list_filter = ('level', )
list_per_page = DJANGO_DB_LOGGER_ADMIN_LIST_PER_PAGE
readonly_fields = ['logger_name', 'level', 'msg', 'trace', ]
date_hierarchy = 'create_datetime'

def colored_msg(self, instance):
if instance.level in [logging.NOTSET, logging.INFO]:
Expand All @@ -28,8 +31,15 @@ def traceback(self, instance):
return format_html('<pre><code>{content}</code></pre>', content=instance.trace if instance.trace else '')

def create_datetime_format(self, instance):
return instance.create_datetime.strftime('%Y-%m-%d %X')
return format_html(
'<span style="white-space: nowrap;">%s</span>' % \
timezone.localtime(instance.create_datetime).strftime('%Y-%m-%d %X')
)
create_datetime_format.short_description = 'Created at'

def has_add_permission(self, request):
# Hide "Add" button from admin
return False

admin.site.register(StatusLog, StatusLogAdmin)

admin.site.register(StatusLog, StatusLogAdmin)
2 changes: 2 additions & 0 deletions django_db_logger/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,5 @@
DJANGO_DB_LOGGER_ADMIN_LIST_PER_PAGE = getattr(settings, 'DJANGO_DB_LOGGER_ADMIN_LIST_PER_PAGE', 10)

DJANGO_DB_LOGGER_ENABLE_FORMATTER = getattr(settings, 'DJANGO_DB_LOGGER_ENABLE_FORMATTER', False)

DJANGO_DB_LOGGER_MAX_LOG_RECORDS = getattr(settings, 'DJANGO_DB_LOGGER_MAX_LOG_RECORDS', 0)
13 changes: 12 additions & 1 deletion django_db_logger/db_log_handler.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
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_MAX_LOG_RECORDS


db_default_formatter = logging.Formatter()
Expand All @@ -9,7 +10,7 @@
class DatabaseLogHandler(logging.Handler):
def emit(self, record):
from .models import StatusLog

trace = None

if record.exc_info:
Expand All @@ -28,6 +29,7 @@ def emit(self, record):
}

StatusLog.objects.create(**kwargs)
self.cleanup_status_log()

def format(self, record):
if self.formatter:
Expand All @@ -46,3 +48,12 @@ def format(self, record):
return fmt.formatMessage(record)
else:
return fmt.format(record)

def cleanup_status_log(self):
from .models import StatusLog
if DJANGO_DB_LOGGER_MAX_LOG_RECORDS > 0 and \
StatusLog.objects.count() >DJANGO_DB_LOGGER_MAX_LOG_RECORDS:
# Remove olders records
queryset = StatusLog.objects.all()[DJANGO_DB_LOGGER_MAX_LOG_RECORDS:]
for row in queryset.iterator():
row.delete()