aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Johannes Christ <[email protected]>2019-08-14 21:22:22 +0200
committerGravatar GitHub <[email protected]>2019-08-14 21:22:22 +0200
commit3c32dd00904ea2ed568c134404165309c8b0d4af (patch)
treed65be76a5f5eea4882e11b85c81dc63318f54eac
parentMerge pull request #229 from python-discord/low-hanging-merge-fruit (diff)
parentUse different field values. (diff)
Merge pull request #235 from python-discord/ouroboros-logging-handler
log everything into the database in addition to stdout
-rw-r--r--pydis_site/apps/api/dblogger.py22
-rw-r--r--pydis_site/apps/api/tests/test_dblogger.py27
-rw-r--r--pydis_site/settings.py5
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',