logging: Added QueueHandler.prepare and updated documentation.

This commit is contained in:
Vinay Sajip 2010-09-22 20:34:53 +00:00
parent b5d23b4dfc
commit 0258ce8f0a
2 changed files with 42 additions and 13 deletions

View File

@ -944,6 +944,7 @@ Loggers have the following attributes and methods. Note that Loggers are never
instantiated directly, but always through the module-level function
``logging.getLogger(name)``.
.. class:: Logger
.. attribute:: Logger.propagate
@ -2661,7 +2662,20 @@ supports sending logging messages to a queue, such as those implemented in the
.. method:: emit(record)
Sends the record to the handler's queue.
Enqueues the result of preparing the LogRecord.
.. method:: prepare(record)
Prepares a record for queuing. The object returned by this
method is enqueued.
The base implementation formats the record to merge the message
and arguments, and removes unpickleable items from the record
in-place.
You might want to override this method if you want to convert
the record to a dict or JSON string, or send a modified copy
of the record while leaving the original intact.
.. method:: enqueue(record)

View File

@ -1176,24 +1176,39 @@ class QueueHandler(logging.Handler):
"""
self.queue.put_nowait(record)
def prepare(self, record):
"""
Prepares a record for queuing. The object returned by this
method is enqueued.
The base implementation formats the record to merge the message
and arguments, and removes unpickleable items from the record
in-place.
You might want to override this method if you want to convert
the record to a dict or JSON string, or send a modified copy
of the record while leaving the original intact.
"""
# The format operation gets traceback text into record.exc_text
# (if there's exception data), and also puts the message into
# record.message. We can then use this to replace the original
# msg + args, as these might be unpickleable. We also zap the
# exc_info attribute, as it's no longer needed and, if not None,
# will typically not be pickleable.
self.format(record)
record.msg = record.message
record.args = None
record.exc_info = None
return record
def emit(self, record):
"""
Emit a record.
Writes the LogRecord to the queue, preparing it for pickling first.
Writes the LogRecord to the queue, preparing it first.
"""
try:
# The format operation gets traceback text into record.exc_text
# (if there's exception data), and also puts the message into
# record.message. We can then use this to replace the original
# msg + args, as these might be unpickleable. We also zap the
# exc_info attribute, as it's no longer needed and, if not None,
# will typically not be pickleable.
self.format(record)
record.msg = record.message
record.args = None
record.exc_info = None
self.enqueue(record)
self.enqueue(self.prepare(record))
except (KeyboardInterrupt, SystemExit):
raise
except: