From 657514a69039ad60af1b3b98254dff863d800d95 Mon Sep 17 00:00:00 2001 From: Vinay Sajip Date: Sun, 7 Feb 2010 01:37:08 +0000 Subject: [PATCH] Issue #7868: logging: added loggerClass attribute to Manager. --- Lib/logging/__init__.py | 21 ++++++++++++++++----- Lib/test/test_logging.py | 27 ++++++++++++++++++++++----- Misc/NEWS | 2 ++ 3 files changed, 40 insertions(+), 10 deletions(-) diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py index b5390cc8c1..5c727b0fe1 100644 --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -1,4 +1,4 @@ -# Copyright 2001-2009 by Vinay Sajip. All Rights Reserved. +# Copyright 2001-2010 by Vinay Sajip. All Rights Reserved. # # Permission to use, copy, modify, and distribute this software and its # documentation for any purpose and without fee is hereby granted, @@ -46,8 +46,8 @@ except ImportError: __author__ = "Vinay Sajip " __status__ = "production" -__version__ = "0.5.1.1" -__date__ = "25 November 2009" +__version__ = "0.5.1.2" +__date__ = "07 February 2010" #--------------------------------------------------------------------------- # Miscellaneous module data @@ -962,6 +962,7 @@ class Manager(object): self.disable = 0 self.emittedNoHandlerWarning = 0 self.loggerDict = {} + self.loggerClass = None def getLogger(self, name): """ @@ -981,13 +982,13 @@ class Manager(object): rv = self.loggerDict[name] if isinstance(rv, PlaceHolder): ph = rv - rv = _loggerClass(name) + rv = (self.loggerClass or _loggerClass)(name) rv.manager = self self.loggerDict[name] = rv self._fixupChildren(ph, rv) self._fixupParents(rv) else: - rv = _loggerClass(name) + rv = (self.loggerClass or _loggerClass)(name) rv.manager = self self.loggerDict[name] = rv self._fixupParents(rv) @@ -995,6 +996,16 @@ class Manager(object): _releaseLock() return rv + def setLoggerClass(self, klass): + """ + Set the class to be used when instantiating a logger with this Manager. + """ + if klass != Logger: + if not issubclass(klass, Logger): + raise TypeError("logger not derived from logging.Logger: " + + klass.__name__) + self.loggerClass = klass + 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 b9825cd5a4..0ef66a0545 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -1593,7 +1593,6 @@ class ConfigDictTest(BaseTest): logging.config.stopListening() t.join(2.0) - #@unittest.skip("See issue #7857") def test_listen_config_10_ok(self): with captured_stdout() as output: self.setup_via_listener(json.dumps(self.config10)) @@ -1613,7 +1612,6 @@ class ConfigDictTest(BaseTest): ('ERROR', '4'), ], stream=output) - #@unittest.skip("See issue #7857") def test_listen_config_1_ok(self): with captured_stdout() as output: self.setup_via_listener(textwrap.dedent(ConfigFileTest.config1)) @@ -1629,15 +1627,34 @@ class ConfigDictTest(BaseTest): self.assert_log_lines([]) +class ManagerTest(BaseTest): + def test_manager_loggerclass(self): + logged = [] + + class MyLogger(logging.Logger): + def _log(self, level, msg, args, exc_info=None, extra=None): + logged.append(msg) + + man = logging.Manager(None) + self.assertRaises(TypeError, man.setLoggerClass, int) + man.setLoggerClass(MyLogger) + logger = man.getLogger('test') + print >> open('/tmp/tmp.txt', 'w'), type(logger) + logger.warning('should appear in logged') + logging.warning('should not appear in logged') + + self.assertEqual(logged, ['should appear in logged']) + + # Set the locale to the platform-dependent default. I have no idea # why the test does this, but in any case we save the current locale # first and restore it at the end. @run_with_locale('LC_ALL', '') def test_main(): run_unittest(BuiltinLevelsTest, BasicFilterTest, - CustomLevelsAndFiltersTest, MemoryHandlerTest, - ConfigFileTest, SocketHandlerTest, MemoryTest, - EncodingTest, WarningsTest, ConfigDictTest) + CustomLevelsAndFiltersTest, MemoryHandlerTest, + ConfigFileTest, SocketHandlerTest, MemoryTest, + EncodingTest, WarningsTest, ConfigDictTest, ManagerTest) if __name__ == "__main__": test_main() diff --git a/Misc/NEWS b/Misc/NEWS index 1f0fa73064..f9f99413c0 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -75,6 +75,8 @@ Core and Builtins Library ------- +- Issue #7868: logging: added loggerClass attribute to Manager. + - Issue #7851: logging: clarification on logging configuration files. - Issue #4772: Raise a ValueError when an unknown Bluetooth protocol is -- 2.40.0