@@ -398,7 +398,26 @@ def create_timed_rotating_logger(
398398
399399
400400# Public API wrapper classes - act like logging.Logger with context manager support
401- class BasicLog :
401+ class _LoggerMixin :
402+ """Mixin providing common logger wrapper functionality with context manager support."""
403+
404+ _logger : logging .Logger
405+
406+ def __getattr__ (self , name : str ):
407+ """Delegate attribute access to the underlying logger."""
408+ return getattr (self ._logger , name )
409+
410+ def __enter__ (self ):
411+ """Context manager entry."""
412+ return self
413+
414+ def __exit__ (self , exc_type , exc_val , exc_tb ):
415+ """Context manager exit with automatic cleanup."""
416+ cleanup_logger_handlers (self ._logger )
417+ return False
418+
419+
420+ class BasicLog (_LoggerMixin ):
402421 """Basic logger wrapper that acts like logging.Logger with context manager support.
403422
404423 Usage:
@@ -430,21 +449,8 @@ def __init__(
430449 )
431450 self ._name = name or get_log_settings ().appname
432451
433- def __getattr__ (self , name : str ):
434- """Delegate attribute access to the underlying logger."""
435- return getattr (self ._logger , name )
436-
437- def __enter__ (self ):
438- """Context manager entry."""
439- return self
440-
441- def __exit__ (self , exc_type , exc_val , exc_tb ):
442- """Context manager exit with automatic cleanup."""
443- cleanup_logger_handlers (self ._logger )
444- return False
445452
446-
447- class SizeRotatingLog :
453+ class SizeRotatingLog (_LoggerMixin ):
448454 """Size-based rotating logger wrapper that acts like logging.Logger with context manager support.
449455
450456 Usage:
@@ -486,21 +492,8 @@ def __init__(
486492 )
487493 self ._name = name or get_log_settings ().appname
488494
489- def __getattr__ (self , name : str ):
490- """Delegate attribute access to the underlying logger."""
491- return getattr (self ._logger , name )
492-
493- def __enter__ (self ):
494- """Context manager entry."""
495- return self
496-
497- def __exit__ (self , exc_type , exc_val , exc_tb ):
498- """Context manager exit with automatic cleanup."""
499- cleanup_logger_handlers (self ._logger )
500- return False
501-
502495
503- class TimedRotatingLog :
496+ class TimedRotatingLog ( _LoggerMixin ) :
504497 """Time-based rotating logger wrapper that acts like logging.Logger with context manager support.
505498
506499 Usage:
@@ -546,19 +539,6 @@ def __init__(
546539 )
547540 self ._name = name or get_log_settings ().appname
548541
549- def __getattr__ (self , name : str ):
550- """Delegate attribute access to the underlying logger."""
551- return getattr (self ._logger , name )
552-
553- def __enter__ (self ):
554- """Context manager entry."""
555- return self
556-
557- def __exit__ (self , exc_type , exc_val , exc_tb ):
558- """Context manager exit with automatic cleanup."""
559- cleanup_logger_handlers (self ._logger )
560- return False
561-
562542
563543# Convenience functions
564544def clear_logger_registry () -> None :
0 commit comments