[Checkins] SVN: zc.zservertracelog/branches/alex-extensions-2/ - added tracelog to the WSGI environment.

Alex Smith asmith at zope.com
Fri Sep 12 16:08:13 EDT 2008


Log message for revision 91102:
  
  - added tracelog to the WSGI environment.
  - refactored tracelog implementation.
  

Changed:
  U   zc.zservertracelog/branches/alex-extensions-2/CHANGES.txt
  U   zc.zservertracelog/branches/alex-extensions-2/src/zc/zservertracelog/README.txt
  U   zc.zservertracelog/branches/alex-extensions-2/src/zc/zservertracelog/interfaces.py
  U   zc.zservertracelog/branches/alex-extensions-2/src/zc/zservertracelog/tracelog.py

-=-
Modified: zc.zservertracelog/branches/alex-extensions-2/CHANGES.txt
===================================================================
--- zc.zservertracelog/branches/alex-extensions-2/CHANGES.txt	2008-09-12 19:41:56 UTC (rev 91101)
+++ zc.zservertracelog/branches/alex-extensions-2/CHANGES.txt	2008-09-12 20:08:12 UTC (rev 91102)
@@ -13,3 +13,5 @@
   characters.
 
 * added request query strings to log.
+
+* added the tracelog to the WSGI environment.

Modified: zc.zservertracelog/branches/alex-extensions-2/src/zc/zservertracelog/README.txt
===================================================================
--- zc.zservertracelog/branches/alex-extensions-2/src/zc/zservertracelog/README.txt	2008-09-12 19:41:56 UTC (rev 91101)
+++ zc.zservertracelog/branches/alex-extensions-2/src/zc/zservertracelog/README.txt	2008-09-12 20:08:12 UTC (rev 91102)
@@ -172,3 +172,26 @@
     C 21598352 2008-09-12T11:40:27
     A 21598352 2008-09-12T11:40:27 200 ?
     E 21598352 2008-09-12T11:40:27
+
+
+Adding Additional Entries to the Trace Log
+==========================================
+
+A tracelog object is added to the WSGI environment on each request.  This
+object implements ``ITraceLog`` and provides applications a method to add
+custom entries to the log.
+
+Here is an example application that adds a custom entry to the tracelog.
+
+    >>> def noisy_app(environ, start_response):
+    ...     logger = environ['zc.zservertracelog.TraceLog']
+    ...     logger.log('beep! beep!')
+    >>> faux_app.app_hook = noisy_app
+
+    >>> invokeRequest(req1)
+    B 21569456 2008-09-12T15:51:05 GET /test-req1
+    I 21569456 2008-09-12T15:51:05 0
+    C 21569456 2008-09-12T15:51:05
+    X 21569456 2008-09-12T15:51:05 beep! beep!
+    A 21569456 2008-09-12T15:51:05 200 ?
+    E 21569456 2008-09-12T15:51:05

Modified: zc.zservertracelog/branches/alex-extensions-2/src/zc/zservertracelog/interfaces.py
===================================================================
--- zc.zservertracelog/branches/alex-extensions-2/src/zc/zservertracelog/interfaces.py	2008-09-12 19:41:56 UTC (rev 91101)
+++ zc.zservertracelog/branches/alex-extensions-2/src/zc/zservertracelog/interfaces.py	2008-09-12 20:08:12 UTC (rev 91102)
@@ -19,7 +19,7 @@
 
 
 class ITraceLog(zope.interface.Interface):
-    """Logs records from writers."""
+    """Writes messages to the trace log."""
 
-    def log(msg=None, timestamp=None):
+    def log(msg=None):
         """Write a message to the trace log."""

Modified: zc.zservertracelog/branches/alex-extensions-2/src/zc/zservertracelog/tracelog.py
===================================================================
--- zc.zservertracelog/branches/alex-extensions-2/src/zc/zservertracelog/tracelog.py	2008-09-12 19:41:56 UTC (rev 91101)
+++ zc.zservertracelog/branches/alex-extensions-2/src/zc/zservertracelog/tracelog.py	2008-09-12 20:08:12 UTC (rev 91102)
@@ -32,45 +32,28 @@
     return dt.replace(microsecond=0).isoformat()
 
 
-def _log(logger, trace_code, msg=None, timestamp=None):
-    logger.trace_code = trace_code
-    logger.extension_id = None
-    logger.log(msg, timestamp)
-    logger.trace_code = None
+def _log(channel_id, trace_code='X', msg=None, timestamp=None):
+    if timestamp is None:
+        timestamp = datetime.datetime.now()
 
+    entry = '%s %s %s' % (trace_code, channel_id, _format_datetime(timestamp))
 
-class TraceLog(object):
-    zope.interface.implements(zc.zservertracelog.interfaces.ITraceLog)
+    if msg:
+        entry += ' %s' % repr(msg)[1:-1]
 
-    extension_id = None
-    trace_code = None
+    tracelog.info(entry)
 
-    def __init__(self, channel):
-        self.channel_id = id(channel)
 
-    def log(self, msg=None, timestamp=None):
+class TraceLog(object):
+    zope.interface.implements(zc.zservertracelog.interfaces.ITraceLog)
 
-        if timestamp is None:
-            timestamp = datetime.datetime.now()
+    def __init__(self, channel_id):
+        self.channel_id = channel_id
 
-        if not self.trace_code:
-            self.trace_code = 'X'
+    def log(self, msg=None):
+        _log(self.channel_id, 'X', msg)
 
-        if self.trace_code == 'X' and not self.extension_id:
-            raise ValueError('Unnamed Tracelog Extension')
 
-        entry = '%s %s %s' % (
-            self.trace_code, self.channel_id, _format_datetime(timestamp))
-
-        if self.extension_id:
-            entry += ' %s' % self.extension_id
-
-        if msg:
-            entry += ' %s' % repr(msg)[1:-1]
-
-        tracelog.info(entry)
-
-
 class Parser(zope.server.http.httprequestparser.HTTPRequestParser):
 
     def __init__(self, x):
@@ -82,16 +65,15 @@
     parser_class = Parser
 
     def handle_request(self, parser):
-        logger = TraceLog(self)
-
         full_path = parser.path
         if parser.query:
             full_path += '?%s' % parser.query
         elif parser.query is not None:
             full_path += '?'
 
-        _log(logger, 'B', '%s %s' % (parser.command, full_path), parser.__B)
-        _log(logger, 'I', str(parser.content_length))
+        cid = id(self)
+        _log(cid, 'B', '%s %s' % (parser.command, full_path), parser.__B)
+        _log(cid, 'I', str(parser.content_length))
 
         zope.server.http.httpserverchannel.HTTPServerChannel.handle_request(
             self, parser)
@@ -107,10 +89,11 @@
 
     def executeRequest(self, task):
         """Overrides HTTPServer.executeRequest()."""
-        logger = TraceLog(task.channel)
-        _log(logger, 'C')
+        cid = id(task.channel)
+        _log(cid, 'C')
         env = task.getCGIEnvironment()
         env['wsgi.input'] = task.request_data.getBodyStream()
+        env['zc.zservertracelog.TraceLog'] = TraceLog(cid)
 
         def start_response(status, headers):
             # Prepare the headers for output
@@ -125,10 +108,11 @@
         try:
             response = self.application(env, start_response)
         except Exception, v:
-            _log(logger, 'A', 'Error: %s' % v)
-            _log(logger, 'E')
+            _log(cid, 'A', 'Error: %s' % v)
+            _log(cid, 'E')
             raise
         else:
+            del env['zc.zservertracelog.TraceLog']
             accumulated_headers = getattr(task, 'accumulated_headers') or ()
             length = [h.split(': ')[1].strip()
                       for h in accumulated_headers
@@ -138,15 +122,15 @@
             else:
                 length = '?'
 
-            _log(logger, 'A', '%s %s' % (getattr(task, 'status', '?'), length))
+            _log(cid, 'A', '%s %s' % (getattr(task, 'status', '?'), length))
 
             try:
                 task.write(response)
             except Exception, v:
-                _log(logger, 'E', 'Error: %s' % v)
+                _log(cid, 'E', 'Error: %s' % v)
                 raise
             else:
-                _log(logger, 'E')
+                _log(cid, 'E')
 
 
 http = servertype.ServerType(



More information about the Checkins mailing list