Commit 657514a6 authored by Vinay Sajip's avatar Vinay Sajip

Issue #7868: logging: added loggerClass attribute to Manager.

parent 12cad204
# 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 # Permission to use, copy, modify, and distribute this software and its
# documentation for any purpose and without fee is hereby granted, # documentation for any purpose and without fee is hereby granted,
...@@ -46,8 +46,8 @@ except ImportError: ...@@ -46,8 +46,8 @@ except ImportError:
__author__ = "Vinay Sajip <vinay_sajip@red-dove.com>" __author__ = "Vinay Sajip <vinay_sajip@red-dove.com>"
__status__ = "production" __status__ = "production"
__version__ = "0.5.1.1" __version__ = "0.5.1.2"
__date__ = "25 November 2009" __date__ = "07 February 2010"
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# Miscellaneous module data # Miscellaneous module data
...@@ -962,6 +962,7 @@ class Manager(object): ...@@ -962,6 +962,7 @@ class Manager(object):
self.disable = 0 self.disable = 0
self.emittedNoHandlerWarning = 0 self.emittedNoHandlerWarning = 0
self.loggerDict = {} self.loggerDict = {}
self.loggerClass = None
def getLogger(self, name): def getLogger(self, name):
""" """
...@@ -981,13 +982,13 @@ class Manager(object): ...@@ -981,13 +982,13 @@ class Manager(object):
rv = self.loggerDict[name] rv = self.loggerDict[name]
if isinstance(rv, PlaceHolder): if isinstance(rv, PlaceHolder):
ph = rv ph = rv
rv = _loggerClass(name) rv = (self.loggerClass or _loggerClass)(name)
rv.manager = self rv.manager = self
self.loggerDict[name] = rv self.loggerDict[name] = rv
self._fixupChildren(ph, rv) self._fixupChildren(ph, rv)
self._fixupParents(rv) self._fixupParents(rv)
else: else:
rv = _loggerClass(name) rv = (self.loggerClass or _loggerClass)(name)
rv.manager = self rv.manager = self
self.loggerDict[name] = rv self.loggerDict[name] = rv
self._fixupParents(rv) self._fixupParents(rv)
...@@ -995,6 +996,16 @@ class Manager(object): ...@@ -995,6 +996,16 @@ class Manager(object):
_releaseLock() _releaseLock()
return rv 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): def _fixupParents(self, alogger):
""" """
Ensure that there are either loggers or placeholders all the way Ensure that there are either loggers or placeholders all the way
......
...@@ -1593,7 +1593,6 @@ class ConfigDictTest(BaseTest): ...@@ -1593,7 +1593,6 @@ class ConfigDictTest(BaseTest):
logging.config.stopListening() logging.config.stopListening()
t.join(2.0) t.join(2.0)
#@unittest.skip("See issue #7857")
def test_listen_config_10_ok(self): def test_listen_config_10_ok(self):
with captured_stdout() as output: with captured_stdout() as output:
self.setup_via_listener(json.dumps(self.config10)) self.setup_via_listener(json.dumps(self.config10))
...@@ -1613,7 +1612,6 @@ class ConfigDictTest(BaseTest): ...@@ -1613,7 +1612,6 @@ class ConfigDictTest(BaseTest):
('ERROR', '4'), ('ERROR', '4'),
], stream=output) ], stream=output)
#@unittest.skip("See issue #7857")
def test_listen_config_1_ok(self): def test_listen_config_1_ok(self):
with captured_stdout() as output: with captured_stdout() as output:
self.setup_via_listener(textwrap.dedent(ConfigFileTest.config1)) self.setup_via_listener(textwrap.dedent(ConfigFileTest.config1))
...@@ -1629,6 +1627,25 @@ class ConfigDictTest(BaseTest): ...@@ -1629,6 +1627,25 @@ class ConfigDictTest(BaseTest):
self.assert_log_lines([]) 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 # 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 # why the test does this, but in any case we save the current locale
# first and restore it at the end. # first and restore it at the end.
...@@ -1637,7 +1654,7 @@ def test_main(): ...@@ -1637,7 +1654,7 @@ def test_main():
run_unittest(BuiltinLevelsTest, BasicFilterTest, run_unittest(BuiltinLevelsTest, BasicFilterTest,
CustomLevelsAndFiltersTest, MemoryHandlerTest, CustomLevelsAndFiltersTest, MemoryHandlerTest,
ConfigFileTest, SocketHandlerTest, MemoryTest, ConfigFileTest, SocketHandlerTest, MemoryTest,
EncodingTest, WarningsTest, ConfigDictTest) EncodingTest, WarningsTest, ConfigDictTest, ManagerTest)
if __name__ == "__main__": if __name__ == "__main__":
test_main() test_main()
...@@ -75,6 +75,8 @@ Core and Builtins ...@@ -75,6 +75,8 @@ Core and Builtins
Library Library
------- -------
- Issue #7868: logging: added loggerClass attribute to Manager.
- Issue #7851: logging: clarification on logging configuration files. - Issue #7851: logging: clarification on logging configuration files.
- Issue #4772: Raise a ValueError when an unknown Bluetooth protocol is - Issue #4772: Raise a ValueError when an unknown Bluetooth protocol is
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment