diff options
author | favll <favll@users.noreply.github.com> | 2017-08-01 20:12:26 +0200 |
---|---|---|
committer | Vinay Sajip <vinay_sajip@yahoo.co.uk> | 2017-08-01 19:12:26 +0100 |
commit | adfe3440f65dfd6cf4463db6cd02cdc78e77ce17 (patch) | |
tree | 0387a80a252654820ebd92e1833023008092cce0 | |
parent | 6f446bee4f6ac0c61bb2c3386a0149fd36855793 (diff) | |
download | cpython-git-adfe3440f65dfd6cf4463db6cd02cdc78e77ce17.tar.gz |
bpo-31084: QueueHandler now formats messages correctly. (GH-2954)
-rw-r--r-- | Lib/logging/handlers.py | 9 | ||||
-rw-r--r-- | Lib/test/test_logging.py | 14 |
2 files changed, 19 insertions, 4 deletions
diff --git a/Lib/logging/handlers.py b/Lib/logging/handlers.py index 2f934b3307..b5fdfbc683 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 6d0b23441b..36ea072515 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): |