@@ -135,7 +135,9 @@ def tearDown(self):
135
135
logging ._handlers .clear ()
136
136
logging ._handlers .update (self .saved_handlers )
137
137
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
139
141
loggerDict .clear ()
140
142
loggerDict .update (self .saved_loggers )
141
143
logger_states = self .logger_states
@@ -4094,6 +4096,62 @@ def test_pickling(self):
4094
4096
unpickled = pickle .loads (s )
4095
4097
self .assertIs (unpickled , logger )
4096
4098
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
+
4097
4155
4098
4156
class BaseFileTest (BaseTest ):
4099
4157
"Base class for handler tests that write log files"
0 commit comments