[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