From: Vinay Sajip <vinay_sajip@yahoo.co.uk>
Date: Wed, 22 Sep 2010 20:34:53 +0000 (+0000)
Subject: logging: Added QueueHandler.prepare and updated documentation.
X-Git-Tag: v3.2a3~171
X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0258ce8f0a992ffe24a7b77314603cc7224c3971;p=python

logging: Added QueueHandler.prepare and updated documentation.
---

diff --git a/Doc/library/logging.rst b/Doc/library/logging.rst
index 6cfd93f61b..04a1e5bbcd 100644
--- a/Doc/library/logging.rst
+++ b/Doc/library/logging.rst
@@ -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)
 
diff --git a/Lib/logging/handlers.py b/Lib/logging/handlers.py
index ce0673d9a1..3d7a6786a9 100644
--- a/Lib/logging/handlers.py
+++ b/Lib/logging/handlers.py
@@ -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: