diff --git a/README.rst b/README.rst index 5f15702..079ce65 100644 --- a/README.rst +++ b/README.rst @@ -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 `_ +.. 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( + '%s' % \ + 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`` \ No newline at end of file +so DJANGO_DB_LOGGER_MAX_LOG_RECORDS is not required anymore. diff --git a/django_db_logger/admin.py b/django_db_logger/admin.py index 4ec93c2..7642817 100644 --- a/django_db_logger/admin.py +++ b/django_db_logger/admin.py @@ -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]: @@ -28,8 +31,15 @@ def traceback(self, instance): return format_html('
{content}
', 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( + '%s' % \ + 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) \ No newline at end of file + +admin.site.register(StatusLog, StatusLogAdmin) diff --git a/django_db_logger/config.py b/django_db_logger/config.py index f96435a..2233c5d 100644 --- a/django_db_logger/config.py +++ b/django_db_logger/config.py @@ -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) diff --git a/django_db_logger/db_log_handler.py b/django_db_logger/db_log_handler.py index 86f48f2..584643a 100644 --- a/django_db_logger/db_log_handler.py +++ b/django_db_logger/db_log_handler.py @@ -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() @@ -9,7 +10,7 @@ class DatabaseLogHandler(logging.Handler): def emit(self, record): from .models import StatusLog - + trace = None if record.exc_info: @@ -28,6 +29,7 @@ def emit(self, record): } StatusLog.objects.create(**kwargs) + self.cleanup_status_log() def format(self, record): if self.formatter: @@ -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()