@@ -129,6 +129,17 @@ class LogCaptureFixture(object):
129
129
def __init__ (self , item ):
130
130
"""Creates a new funcarg."""
131
131
self ._item = item
132
+ self ._initial_log_levels = {} # type: Dict[str, int] # dict of log name -> log level
133
+
134
+ def _finalize (self ):
135
+ """Finalizes the fixture.
136
+
137
+ This restores the log levels changed by :meth:`set_level`.
138
+ """
139
+ # restore log levels
140
+ for logger_name , level in self ._initial_log_levels .items ():
141
+ logger = logging .getLogger (logger_name )
142
+ logger .setLevel (level )
132
143
133
144
@property
134
145
def handler (self ):
@@ -160,27 +171,30 @@ def clear(self):
160
171
self .handler .records = []
161
172
162
173
def set_level (self , level , logger = None ):
163
- """Sets the level for capturing of logs.
174
+ """Sets the level for capturing of logs. The level will be restored to its previous value at the end of
175
+ the test.
164
176
165
177
:param int level: the logger to level.
166
178
:param str logger: the logger to update the level. If not given, the root logger level is updated.
179
+
180
+ .. versionchanged:: 3.4
181
+ The levels of the loggers changed by this function will be restored to their initial values at the
182
+ end of the test.
167
183
"""
168
- logger = logging .getLogger (logger )
184
+ logger_name = logger
185
+ logger = logging .getLogger (logger_name )
186
+ self ._initial_log_levels .setdefault (logger_name , logger .level )
169
187
logger .setLevel (level )
170
188
171
189
@contextmanager
172
190
def at_level (self , level , logger = None ):
173
- """Context manager that sets the level for capturing of logs.
191
+ """Context manager that sets the level for capturing of logs. After the end of the 'with' statement the
192
+ level is restored to its original value.
174
193
175
- By default, the level is set on the handler used to capture
176
- logs. Specify a logger name to instead set the level of any
177
- logger.
194
+ :param int level: the logger to level.
195
+ :param str logger: the logger to update the level. If not given, the root logger level is updated.
178
196
"""
179
- if logger is None :
180
- logger = self .handler
181
- else :
182
- logger = logging .getLogger (logger )
183
-
197
+ logger = logging .getLogger (logger )
184
198
orig_level = logger .level
185
199
logger .setLevel (level )
186
200
try :
@@ -199,7 +213,9 @@ def caplog(request):
199
213
* caplog.records() -> list of logging.LogRecord instances
200
214
* caplog.record_tuples() -> list of (logger_name, level, message) tuples
201
215
"""
202
- return LogCaptureFixture (request .node )
216
+ result = LogCaptureFixture (request .node )
217
+ yield result
218
+ result ._finalize ()
203
219
204
220
205
221
def get_actual_log_level (config , * setting_names ):
0 commit comments