aboutsummaryrefslogtreecommitdiffstats
path: root/debug_toolbar/panels/logger.py
diff options
context:
space:
mode:
authorAlex Gaynor2008-09-27 15:50:47 -0400
committerAlex Gaynor2008-09-27 15:50:47 -0400
commitc70df302e1564a7f7fe7883d3e042419ece1d9e6 (patch)
tree6440feca2e9e0eaed4511c498ddae320769bca0c /debug_toolbar/panels/logger.py
parent225965ceb490d55207733aa297fd0d8a9c1cbfec (diff)
downloaddjango-debug-toolbar-c70df302e1564a7f7fe7883d3e042419ece1d9e6.tar.bz2
added logger panel
Diffstat (limited to 'debug_toolbar/panels/logger.py')
-rw-r--r--debug_toolbar/panels/logger.py73
1 files changed, 73 insertions, 0 deletions
diff --git a/debug_toolbar/panels/logger.py b/debug_toolbar/panels/logger.py
new file mode 100644
index 0000000..e3fd21e
--- /dev/null
+++ b/debug_toolbar/panels/logger.py
@@ -0,0 +1,73 @@
+import datetime
+import logging
+
+try:
+ import threading
+except ImportError:
+ threading = None
+
+from django.template.loader import render_to_string
+
+from debug_toolbar.panels import DebugPanel
+
+class ThreadTrackingHandler(logging.Handler):
+ def __init__(self):
+ if threading is None:
+ raise NotImplementedError("threading module is not available, \
+ the logging panel cannot be used without it")
+ logging.Handler.__init__(self)
+ self.records = {} # a dictionary that maps threads to log records
+
+ def emit(self, record):
+ self.get_records().append(record)
+
+ def get_records(self, thread=None):
+ """
+ Returns a list of records for the provided thread, of if none is provided,
+ returns a list for the current thread.
+ """
+ if thread is None:
+ thread = threading.currentThread()
+ if thread not in self.records:
+ self.records[thread] = []
+ return self.records[thread]
+
+ def clear_records(self, thread=None):
+ if thread is None:
+ thread = threading.currentThread()
+ if thread in self.records:
+ del self.records[thread]
+
+handler = ThreadTrackingHandler()
+logging.root.setLevel(logging.NOTSET)
+logging.root.addHandler(handler)
+
+class LoggingPanel(DebugPanel):
+ name = 'Logging'
+ has_content = True
+
+ def process_request(self, request):
+ handler.clear_records()
+
+ def get_and_delete(self):
+ records = handler.get_records()
+ handler.clear_records()
+ return records
+
+ def title(self):
+ return "Logging (%s message%s)" % (len(handler.get_records()), (len(handler.get_records()) == 1) and '' or 's')
+
+ def url(self):
+ return ''
+
+ def content(self):
+ records = []
+ for record in self.get_and_delete():
+ records.append({
+ 'message': record.getMessage(),
+ 'time': datetime.datetime.fromtimestamp(record.created),
+ 'level': record.levelname,
+ 'file': record.pathname,
+ 'line': record.lineno,
+ })
+ return render_to_string('debug_toolbar/panels/logger.html', {'records': records})