diff options
-rw-r--r-- | Lib/logging/__init__.py | 8 | ||||
-rw-r--r-- | Lib/test/test_logging.py | 43 | ||||
-rw-r--r-- | Misc/NEWS | 2 |
3 files changed, 51 insertions, 2 deletions
diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py index 0c6a186..995d313 100644 --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -973,6 +973,7 @@ class Manager(object): self.emittedNoHandlerWarning = 0 self.loggerDict = {} self.loggerClass = None + self.logRecordClass = None def getLogger(self, name): """ @@ -1016,6 +1017,13 @@ class Manager(object): + klass.__name__) self.loggerClass = klass + def setLogRecordClass(self, cls): + """ + Set the class to be used when instantiating a log record with this + Manager. + """ + self.logRecordClass = cls + def _fixupParents(self, alogger): """ Ensure that there are either loggers or placeholders all the way diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index c5d8bac..ea2ea2e 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -127,7 +127,8 @@ class BaseTest(unittest.TestCase): except AttributeError: # StringIO.StringIO lacks a reset() method. actual_lines = stream.getvalue().splitlines() - self.assertEquals(len(actual_lines), len(expected_values)) + self.assertEquals(len(actual_lines), len(expected_values), + '%s vs. %s' % (actual_lines, expected_values)) for actual, expected in zip(actual_lines, expected_values): match = pat.search(actual) if not match: @@ -1766,6 +1767,44 @@ class ChildLoggerTest(BaseTest): self.assertTrue(c2 is c3) +class DerivedLogRecord(logging.LogRecord): + pass + +class LogRecordClassTest(BaseTest): + + def setUp(self): + class CheckingFilter(logging.Filter): + def __init__(self, cls): + self.cls = cls + + def filter(self, record): + t = type(record) + if t is not self.cls: + msg = 'Unexpected LogRecord type %s, expected %s' % (t, + self.cls) + raise TypeError(msg) + return True + + BaseTest.setUp(self) + self.filter = CheckingFilter(DerivedLogRecord) + self.root_logger.addFilter(self.filter) + self.orig_cls = logging.getLogRecordClass() + + def tearDown(self): + self.root_logger.removeFilter(self.filter) + BaseTest.tearDown(self) + logging.setLogRecordClass(self.orig_cls) + + def test_logrecord_class(self): + self.assertRaises(TypeError, self.root_logger.warning, + self.next_message()) + logging.setLogRecordClass(DerivedLogRecord) + self.root_logger.error(self.next_message()) + self.assert_log_lines([ + ('root', 'ERROR', '2'), + ]) + + class QueueHandlerTest(BaseTest): # Do not bother with a logger name group. expected_log_pat = r"^[\w.]+ -> ([\w]+): ([\d]+)$" @@ -1877,7 +1916,7 @@ def test_main(): CustomLevelsAndFiltersTest, MemoryHandlerTest, ConfigFileTest, SocketHandlerTest, MemoryTest, EncodingTest, WarningsTest, ConfigDictTest, ManagerTest, - ChildLoggerTest, QueueHandlerTest, + LogRecordClassTest, ChildLoggerTest, QueueHandlerTest, RotatingFileHandlerTest, #TimedRotatingFileHandlerTest ) @@ -34,6 +34,8 @@ Core and Builtins Library ------- +- logging: Added tests for _logRecordClass changes. + - Issue #10092: Properly reset locale in calendar.Locale*Calendar classes. - logging: Added _logRecordClass, getLogRecordClass, setLogRecordClass to |