Development of an internal social media platform with personalised dashboards for students
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

logging.py 2.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. from __future__ import absolute_import, unicode_literals
  2. import datetime
  3. import logging
  4. from django.utils.translation import ugettext_lazy as _, ungettext
  5. from debug_toolbar.panels import Panel
  6. from debug_toolbar.utils import ThreadCollector
  7. try:
  8. import threading
  9. except ImportError:
  10. threading = None
  11. MESSAGE_IF_STRING_REPRESENTATION_INVALID = '[Could not get log message]'
  12. class LogCollector(ThreadCollector):
  13. def collect(self, item, thread=None):
  14. # Avoid logging SQL queries since they are already in the SQL panel
  15. # TODO: Make this check whether SQL panel is enabled
  16. if item.get('channel', '') == 'django.db.backends':
  17. return
  18. super(LogCollector, self).collect(item, thread)
  19. class ThreadTrackingHandler(logging.Handler):
  20. def __init__(self, collector):
  21. logging.Handler.__init__(self)
  22. self.collector = collector
  23. def emit(self, record):
  24. try:
  25. message = record.getMessage()
  26. except Exception:
  27. message = MESSAGE_IF_STRING_REPRESENTATION_INVALID
  28. record = {
  29. 'message': message,
  30. 'time': datetime.datetime.fromtimestamp(record.created),
  31. 'level': record.levelname,
  32. 'file': record.pathname,
  33. 'line': record.lineno,
  34. 'channel': record.name,
  35. }
  36. self.collector.collect(record)
  37. # We don't use enable/disable_instrumentation because logging is global.
  38. # We can't add thread-local logging handlers. Hopefully logging is cheap.
  39. collector = LogCollector()
  40. logging_handler = ThreadTrackingHandler(collector)
  41. logging.root.addHandler(logging_handler)
  42. class LoggingPanel(Panel):
  43. template = 'debug_toolbar/panels/logging.html'
  44. def __init__(self, *args, **kwargs):
  45. super(LoggingPanel, self).__init__(*args, **kwargs)
  46. self._records = {}
  47. nav_title = _("Logging")
  48. @property
  49. def nav_subtitle(self):
  50. records = self._records[threading.currentThread()]
  51. record_count = len(records)
  52. return ungettext("%(count)s message", "%(count)s messages",
  53. record_count) % {'count': record_count}
  54. title = _("Log messages")
  55. def process_request(self, request):
  56. collector.clear_collection()
  57. def generate_stats(self, request, response):
  58. records = collector.get_collection()
  59. self._records[threading.currentThread()] = records
  60. collector.clear_collection()
  61. self.record_stats({'records': records})