From 92265cd600051e357eb5b96b4e9c5daeb98a3534 Mon Sep 17 00:00:00 2001 From: David Vierra Date: Mon, 7 Sep 2015 23:08:43 -1000 Subject: [PATCH] Molest the logging module to make string formatting safer for unicode strings. --- src/mcedit2/main.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/mcedit2/main.py b/src/mcedit2/main.py index 7fe55de..53e93b2 100644 --- a/src/mcedit2/main.py +++ b/src/mcedit2/main.py @@ -72,6 +72,35 @@ def setup_logging(): root_logger = logging.getLogger() root_logger.setLevel(logging.DEBUG) log_debug("Logging level set") + class MCELogRecord(logging.LogRecord): + """ + Override of LogRecord with 100% unicode-safe message formatting + """ + def getMessage(self): + """ + Return the message for this LogRecord. + + Return the message for this LogRecord after merging any user-supplied + arguments with the message. + """ + msg = self.msg + if not isinstance(msg, basestring): + try: + msg = str(self.msg) + except UnicodeError: + msg = self.msg #Defer encoding till later + if self.args: + try: + msg = msg % self.args + except UnicodeDecodeError: + # 'msg' is unicode, but 'args' contains a str with non-ascii chars + # round-trip to str and decode with escapes to avoid encode errors + msg = msg.encode(b'ascii', b'backslashreplace') + msg = msg % self.args + msg = msg.decode(b'ascii', b'replace') + return msg + + logging.LogRecord = MCELogRecord from mcedit2.util.directories import getUserFilesDirectory mceditUserData = getUserFilesDirectory()