diff options
| -rw-r--r-- | pydis_site/apps/api/dblogger.py | 22 | ||||
| -rw-r--r-- | pydis_site/apps/api/tests/test_dblogger.py | 27 | ||||
| -rw-r--r-- | pydis_site/settings.py | 5 | 
3 files changed, 53 insertions, 1 deletions
diff --git a/pydis_site/apps/api/dblogger.py b/pydis_site/apps/api/dblogger.py new file mode 100644 index 00000000..f133832a --- /dev/null +++ b/pydis_site/apps/api/dblogger.py @@ -0,0 +1,22 @@ +from logging import LogRecord, StreamHandler + + +class DatabaseLogHandler(StreamHandler): +    """Logs entries into the database.""" + +    def emit(self, record: LogRecord): +        """Write the given `record` into the database.""" +        # This import needs to be deferred due to Django's application +        # registry instantiation logic loading this handler before the +        # application is ready. +        from pydis_site.apps.api.models.log_entry import LogEntry + +        entry = LogEntry( +            application='site', +            logger_name=record.name, +            level=record.levelname.lower(), +            module=record.module, +            line=record.lineno, +            message=self.format(record) +        ) +        entry.save() diff --git a/pydis_site/apps/api/tests/test_dblogger.py b/pydis_site/apps/api/tests/test_dblogger.py new file mode 100644 index 00000000..bb19f297 --- /dev/null +++ b/pydis_site/apps/api/tests/test_dblogger.py @@ -0,0 +1,27 @@ +import logging +from datetime import datetime + +from django.test import TestCase + +from ..dblogger import DatabaseLogHandler +from ..models import LogEntry + + +class DatabaseLogHandlerTests(TestCase): +    def test_logs_to_database(self): +        module_basename = __name__.split('.')[-1] +        logger = logging.getLogger(__name__) +        logger.handlers = [DatabaseLogHandler()] +        logger.warning("I am a test case!") + +        # Ensure we only have a single record in the database +        # after the logging call above. +        [entry] = LogEntry.objects.all() + +        self.assertEqual(entry.application, 'site') +        self.assertEqual(entry.logger_name, __name__) +        self.assertIsInstance(entry.timestamp, datetime) +        self.assertEqual(entry.level, 'warning') +        self.assertEqual(entry.module, module_basename) +        self.assertIsInstance(entry.line, int) +        self.assertEqual(entry.message, "I am a test case!") diff --git a/pydis_site/settings.py b/pydis_site/settings.py index 2050c6ab..4a4eb94b 100644 --- a/pydis_site/settings.py +++ b/pydis_site/settings.py @@ -227,11 +227,14 @@ LOGGING = {      'handlers': {          'console': {              'class': 'logging.StreamHandler' +        }, +        'database': { +            'class': 'pydis_site.apps.api.dblogger.DatabaseLogHandler'          }      },      'loggers': {          'django': { -            'handlers': ['console'], +            'handlers': ['console', 'database'],              'propagate': True,              'level': env(                  'LOG_LEVEL',  |