mirror of
https://github.com/python/cpython.git
synced 2025-09-26 10:19:53 +00:00
Issue #7868: logging: added loggerClass attribute to Manager.
This commit is contained in:
parent
12cad204a0
commit
657514a690
3 changed files with 40 additions and 10 deletions
|
@ -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
|
# 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:
|
||||||
|
|
||||||
__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):
|
||||||
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):
|
||||||
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):
|
||||||
_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):
|
||||||
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):
|
||||||
('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,15 +1627,34 @@ 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.
|
||||||
@run_with_locale('LC_ALL', '')
|
@run_with_locale('LC_ALL', '')
|
||||||
def test_main():
|
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
|
||||||
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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue