diff options
| author | 2019-08-14 21:22:22 +0200 | |
|---|---|---|
| committer | 2019-08-14 21:22:22 +0200 | |
| commit | 3c32dd00904ea2ed568c134404165309c8b0d4af (patch) | |
| tree | d65be76a5f5eea4882e11b85c81dc63318f54eac /pydis_site/apps/api | |
| parent | Merge pull request #229 from python-discord/low-hanging-merge-fruit (diff) | |
| parent | Use different field values. (diff) | |
Merge pull request #235 from python-discord/ouroboros-logging-handler
log everything into the database in addition to stdout
Diffstat (limited to 'pydis_site/apps/api')
| -rw-r--r-- | pydis_site/apps/api/dblogger.py | 22 | ||||
| -rw-r--r-- | pydis_site/apps/api/tests/test_dblogger.py | 27 |
2 files changed, 49 insertions, 0 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!") |