@@ -135,7 +135,9 @@ def tearDown(self):
135135 logging ._handlers .clear ()
136136 logging ._handlers .update (self .saved_handlers )
137137 logging ._handlerList [:] = self .saved_handler_list
138- loggerDict = logging .getLogger ().manager .loggerDict
138+ manager = logging .getLogger ().manager
139+ manager .disable = 0
140+ loggerDict = manager .loggerDict
139141 loggerDict .clear ()
140142 loggerDict .update (self .saved_loggers )
141143 logger_states = self .logger_states
@@ -4094,6 +4096,62 @@ def test_pickling(self):
40944096 unpickled = pickle .loads (s )
40954097 self .assertIs (unpickled , logger )
40964098
4099+ def test_caching (self ):
4100+ root = self .root_logger
4101+ logger1 = logging .getLogger ("abc" )
4102+ logger2 = logging .getLogger ("abc.def" )
4103+
4104+ # Set root logger level and ensure cache is empty
4105+ root .setLevel (logging .ERROR )
4106+ self .assertEqual (logger2 .getEffectiveLevel (), logging .ERROR )
4107+ self .assertEqual (logger2 ._cache , {})
4108+
4109+ # Ensure cache is populated and calls are consistent
4110+ self .assertTrue (logger2 .isEnabledFor (logging .ERROR ))
4111+ self .assertFalse (logger2 .isEnabledFor (logging .DEBUG ))
4112+ self .assertEqual (logger2 ._cache , {logging .ERROR : True , logging .DEBUG : False })
4113+ self .assertEqual (root ._cache , {})
4114+ self .assertTrue (logger2 .isEnabledFor (logging .ERROR ))
4115+
4116+ # Ensure root cache gets populated
4117+ self .assertEqual (root ._cache , {})
4118+ self .assertTrue (root .isEnabledFor (logging .ERROR ))
4119+ self .assertEqual (root ._cache , {logging .ERROR : True })
4120+
4121+ # Set parent logger level and ensure caches are emptied
4122+ logger1 .setLevel (logging .CRITICAL )
4123+ self .assertEqual (logger2 .getEffectiveLevel (), logging .CRITICAL )
4124+ self .assertEqual (logger2 ._cache , {})
4125+
4126+ # Ensure logger2 uses parent logger's effective level
4127+ self .assertFalse (logger2 .isEnabledFor (logging .ERROR ))
4128+
4129+ # Set level to NOTSET and ensure caches are empty
4130+ logger2 .setLevel (logging .NOTSET )
4131+ self .assertEqual (logger2 .getEffectiveLevel (), logging .CRITICAL )
4132+ self .assertEqual (logger2 ._cache , {})
4133+ self .assertEqual (logger1 ._cache , {})
4134+ self .assertEqual (root ._cache , {})
4135+
4136+ # Verify logger2 follows parent and not root
4137+ self .assertFalse (logger2 .isEnabledFor (logging .ERROR ))
4138+ self .assertTrue (logger2 .isEnabledFor (logging .CRITICAL ))
4139+ self .assertFalse (logger1 .isEnabledFor (logging .ERROR ))
4140+ self .assertTrue (logger1 .isEnabledFor (logging .CRITICAL ))
4141+ self .assertTrue (root .isEnabledFor (logging .ERROR ))
4142+
4143+ # Disable logging in manager and ensure caches are clear
4144+ logging .disable ()
4145+ self .assertEqual (logger2 .getEffectiveLevel (), logging .CRITICAL )
4146+ self .assertEqual (logger2 ._cache , {})
4147+ self .assertEqual (logger1 ._cache , {})
4148+ self .assertEqual (root ._cache , {})
4149+
4150+ # Ensure no loggers are enabled
4151+ self .assertFalse (logger1 .isEnabledFor (logging .CRITICAL ))
4152+ self .assertFalse (logger2 .isEnabledFor (logging .CRITICAL ))
4153+ self .assertFalse (root .isEnabledFor (logging .CRITICAL ))
4154+
40974155
40984156class BaseFileTest (BaseTest ):
40994157 "Base class for handler tests that write log files"
0 commit comments