mirror of
https://github.com/python/cpython.git
synced 2025-08-30 21:48:47 +00:00
bpo-37258: Not a bug, but added a unit test and updated documentation. (GH-14229)
This commit is contained in:
parent
987a0dcfa1
commit
0150001653
2 changed files with 36 additions and 3 deletions
|
@ -50,8 +50,8 @@ listed below.
|
||||||
Logger Objects
|
Logger Objects
|
||||||
--------------
|
--------------
|
||||||
|
|
||||||
Loggers have the following attributes and methods. Note that Loggers are never
|
Loggers have the following attributes and methods. Note that Loggers should
|
||||||
instantiated directly, but always through the module-level function
|
*NEVER* be instantiated directly, but always through the module-level function
|
||||||
``logging.getLogger(name)``. Multiple calls to :func:`getLogger` with the same
|
``logging.getLogger(name)``. Multiple calls to :func:`getLogger` with the same
|
||||||
name will always return a reference to the same Logger object.
|
name will always return a reference to the same Logger object.
|
||||||
|
|
||||||
|
@ -1244,7 +1244,9 @@ functions.
|
||||||
The class should define :meth:`__init__` such that only a name argument is
|
The class should define :meth:`__init__` such that only a name argument is
|
||||||
required, and the :meth:`__init__` should call :meth:`Logger.__init__`. This
|
required, and the :meth:`__init__` should call :meth:`Logger.__init__`. This
|
||||||
function is typically called before any loggers are instantiated by applications
|
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)
|
.. function:: setLogRecordFactory(factory)
|
||||||
|
|
|
@ -4172,6 +4172,37 @@ class ModuleLevelMiscTest(BaseTest):
|
||||||
logging.setLoggerClass(logging.Logger)
|
logging.setLoggerClass(logging.Logger)
|
||||||
self.assertEqual(logging.getLoggerClass(), 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
|
@support.requires_type_collecting
|
||||||
def test_logging_at_shutdown(self):
|
def test_logging_at_shutdown(self):
|
||||||
# Issue #20037
|
# Issue #20037
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue