bpo-37258: Not a bug, but added a unit test and updated documentation. (GH-14229) (GH-14230)

(cherry picked from commit 0150001653)
This commit is contained in:
Miss Islington (bot) 2019-06-19 06:46:55 -07:00 committed by Vinay Sajip
parent f5b89afde1
commit 95ff622028
2 changed files with 36 additions and 3 deletions

View file

@ -50,8 +50,8 @@ listed below.
Logger Objects
--------------
Loggers have the following attributes and methods. Note that Loggers are never
instantiated directly, but always through the module-level function
Loggers have the following attributes and methods. Note that Loggers should
*NEVER* be instantiated directly, but always through the module-level function
``logging.getLogger(name)``. Multiple calls to :func:`getLogger` with the same
name will always return a reference to the same Logger object.
@ -1226,7 +1226,9 @@ functions.
The class should define :meth:`__init__` such that only a name argument is
required, and the :meth:`__init__` should call :meth:`Logger.__init__`. This
function is typically called before any loggers are instantiated by applications
which need to use custom logger behavior.
which need to use custom logger behavior. After this call, as at any other
time, do not instantiate loggers directly using the subclass: continue to use
the :func:`logging.getLogger` API to get your loggers.
.. function:: setLogRecordFactory(factory)

View file

@ -4172,6 +4172,37 @@ class ModuleLevelMiscTest(BaseTest):
logging.setLoggerClass(logging.Logger)
self.assertEqual(logging.getLoggerClass(), logging.Logger)
def test_subclass_logger_cache(self):
# bpo-37258
message = []
class MyLogger(logging.getLoggerClass()):
def __init__(self, name='MyLogger', level=logging.NOTSET):
super().__init__(name, level)
message.append('initialized')
logging.setLoggerClass(MyLogger)
logger = logging.getLogger('just_some_logger')
self.assertEqual(message, ['initialized'])
stream = io.StringIO()
h = logging.StreamHandler(stream)
logger.addHandler(h)
try:
logger.setLevel(logging.DEBUG)
logger.debug("hello")
self.assertEqual(stream.getvalue().strip(), "hello")
stream.truncate(0)
stream.seek(0)
logger.setLevel(logging.INFO)
logger.debug("hello")
self.assertEqual(stream.getvalue(), "")
finally:
logger.removeHandler(h)
h.close()
logging.setLoggerClass(logging.Logger)
@support.requires_type_collecting
def test_logging_at_shutdown(self):
# Issue #20037