diff --git a/Lib/logging/handlers.py b/Lib/logging/handlers.py index 2f934b33071..b5fdfbc6839 100644 --- a/Lib/logging/handlers.py +++ b/Lib/logging/handlers.py @@ -1372,13 +1372,14 @@ class QueueHandler(logging.Handler): 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 + # (if there's exception data), and also returns the formatted + # 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 + msg = self.format(record) + record.message = msg + record.msg = msg record.args = None record.exc_info = None return record diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index 6d0b23441ba..36ea0725153 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -3126,6 +3126,7 @@ class QueueHandlerTest(BaseTest): BaseTest.setUp(self) self.queue = queue.Queue(-1) self.que_hdlr = logging.handlers.QueueHandler(self.queue) + self.name = 'que' self.que_logger = logging.getLogger('que') self.que_logger.propagate = False self.que_logger.setLevel(logging.WARNING) @@ -3147,6 +3148,19 @@ class QueueHandlerTest(BaseTest): self.assertEqual(data.name, self.que_logger.name) self.assertEqual((data.msg, data.args), (msg, None)) + def test_formatting(self): + msg = self.next_message() + levelname = logging.getLevelName(logging.WARNING) + log_format_str = '{name} -> {levelname}: {message}' + formatted_msg = log_format_str.format(name=self.name, + levelname=levelname, message=msg) + formatter = logging.Formatter(self.log_format) + self.que_hdlr.setFormatter(formatter) + self.que_logger.warning(msg) + log_record = self.queue.get_nowait() + self.assertEqual(formatted_msg, log_record.msg) + self.assertEqual(formatted_msg, log_record.message) + @unittest.skipUnless(hasattr(logging.handlers, 'QueueListener'), 'logging.handlers.QueueListener required for this test') def test_queue_listener(self):