Skip to content

Commit ee27499

Browse files
committed
Fix: SuspendedLoggersContext: No longer modify loggerDict
as this destroyed logger hierarchy integrity; only modify the root logger handlers (which is sufficient to suspend logging)
1 parent 9077114 commit ee27499

File tree

2 files changed

+18
-26
lines changed

2 files changed

+18
-26
lines changed

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,14 @@
22

33
## Unreleased Changes
44

5+
### Fixes
6+
7+
* `util.logging`:
8+
* `SuspendedLoggersContext`: No longer modify `loggerDict` as this destroyed logger hierarchy integrity;
9+
only modify the root logger handlers (which is sufficient to suspend logging)
10+
11+
## v1.6.0 (2025-10-20)
12+
513
### Improvements/Changes
614

715
* `evaluation`:

src/sensai/util/logging.py

Lines changed: 10 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -484,57 +484,41 @@ def emit(self, record):
484484
class SuspendedLoggersContext:
485485
"""A context manager that provides an isolated logging environment.
486486
487-
Temporarily removes all existing loggers upon entry, providing a clean slate
488-
for defining new loggers within the context. Upon exit, restores the original
489-
logging configuration. This is useful when you need to temporarily configure
490-
a completely isolated logging setup without interference from existing loggers.
487+
Temporarily removes all root log handlers upon entry, providing a clean slate
488+
for defining new log handlers within the context. Upon exit, restores the original
489+
configuration (root log handlers and log level).
490+
This is useful when you need to temporarily configure an isolated logging setup
491+
with well-defined log handlers.
491492
492493
The context manager:
493-
- Removes all existing loggers on entry
494-
- Allows defining new temporary loggers within the context
495-
- Restores the original logging configuration on exit
496-
- Preserves root logger settings for restoration
494+
- Removes all existing (root) log handlers on entry
495+
- Allows defining new temporary handlers within the context
496+
- Restores the original configuration (handlers and root log level) on exit
497497
498498
Example:
499499
>>> with SuspendedLoggersContext():
500-
... # No loggers are active here (configure your own)
500+
... # No handlers are active here (configure your own and set desired log level)
501501
... pass
502-
>>> # All original loggers are restored here
502+
>>> # Original log handlers are restored here
503503
"""
504504

505505
def __init__(self):
506-
self.saved_loggers: Dict[str, lg.Logger] = {}
507506
self.saved_root_handlers: list = []
508507
self.saved_root_level: Optional[int] = None
509508

510509
def __enter__(self) -> 'SuspendedLoggersContext':
511-
# Save root logger state
512510
root_logger = lg.getLogger()
513511
self.saved_root_handlers = root_logger.handlers.copy()
514512
self.saved_root_level = root_logger.level
515-
516-
# Save all existing loggers
517-
self.saved_loggers = {
518-
name: lg.getLogger(name)
519-
for name in lg.root.manager.loggerDict
520-
}
521-
522-
# Clear all loggers
523-
lg.root.manager.loggerDict.clear()
524513
root_logger.handlers.clear()
525-
526514
return self
527515

528516
def __exit__(self, exc_type, exc_val, exc_tb) -> None:
529-
# Restore root logger state
530517
root_logger = lg.getLogger()
531518
root_logger.handlers = self.saved_root_handlers
532519
if self.saved_root_level is not None:
533520
root_logger.setLevel(self.saved_root_level)
534521

535-
# Restore all saved loggers
536-
lg.root.manager.loggerDict.update(self.saved_loggers)
537-
538522

539523
class LogLevelsChangedContext:
540524
"""

0 commit comments

Comments
 (0)