Skip to content

Commit ce4616e

Browse files
committed
V6.0.0
1 parent 64280c8 commit ce4616e

File tree

4 files changed

+50
-78
lines changed

4 files changed

+50
-78
lines changed

pythonLogs/core/factory.py

Lines changed: 22 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -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
564544
def clear_logger_registry() -> None:

pythonLogs/core/log_utils.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import errno
44
from functools import lru_cache
55
import gzip
6+
import logging
67
import logging.handlers
78
import os
89
from pathlib import Path
@@ -14,6 +15,29 @@
1415
from typing import Callable, Optional, Set
1516
from zoneinfo import ZoneInfo
1617

18+
19+
class RotatingLogMixin:
20+
"""Mixin providing common rotating logger functionality with context manager support."""
21+
22+
logger: logging.Logger | None
23+
24+
def __enter__(self):
25+
"""Context manager entry."""
26+
if not hasattr(self, 'logger') or self.logger is None:
27+
self.init()
28+
return self.logger
29+
30+
def __exit__(self, exc_type, exc_val, exc_tb):
31+
"""Context manager exit with automatic cleanup."""
32+
if hasattr(self, 'logger'):
33+
cleanup_logger_handlers(self.logger)
34+
35+
@staticmethod
36+
def cleanup_logger(logger: logging.Logger) -> None:
37+
"""Static method for cleaning up logger resources."""
38+
cleanup_logger_handlers(logger)
39+
40+
1741
# Global cache for checked directories with thread safety and size limits
1842
_checked_directories: Set[str] = set()
1943
_directory_lock = threading.Lock()

pythonLogs/size_rotating.py

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
from pathlib import Path
44
from pythonLogs.core.constants import MB_TO_BYTES
55
from pythonLogs.core.log_utils import (
6+
RotatingLogMixin,
67
check_directory_permissions,
78
check_filename_instance,
8-
cleanup_logger_handlers,
99
get_level,
1010
get_log_path,
1111
get_logger_and_formatter,
@@ -21,7 +21,7 @@
2121

2222

2323
@auto_thread_safe(['init'])
24-
class SizeRotatingLog:
24+
class SizeRotatingLog(RotatingLogMixin):
2525
"""Size-based rotating logger with context manager support for automatic resource cleanup."""
2626

2727
def __init__(
@@ -86,22 +86,6 @@ def init(self):
8686
register_logger_weakref(logger)
8787
return logger
8888

89-
def __enter__(self):
90-
"""Context manager entry."""
91-
if not hasattr(self, 'logger') or self.logger is None:
92-
self.init()
93-
return self.logger
94-
95-
def __exit__(self, exc_type, exc_val, exc_tb):
96-
"""Context manager exit with automatic cleanup."""
97-
if hasattr(self, 'logger'):
98-
cleanup_logger_handlers(self.logger)
99-
100-
@staticmethod
101-
def cleanup_logger(logger: logging.Logger) -> None:
102-
"""Static method for cleaning up logger resources."""
103-
cleanup_logger_handlers(logger)
104-
10589

10690
class GZipRotatorSize:
10791
def __init__(self, dir_logs: str, daystokeep: int):

pythonLogs/timed_rotating.py

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import logging.handlers
22
import os
33
from pythonLogs.core.log_utils import (
4+
RotatingLogMixin,
45
check_directory_permissions,
56
check_filename_instance,
6-
cleanup_logger_handlers,
77
get_level,
88
get_log_path,
99
get_logger_and_formatter,
@@ -17,7 +17,7 @@
1717

1818

1919
@auto_thread_safe(['init'])
20-
class TimedRotatingLog:
20+
class TimedRotatingLog(RotatingLogMixin):
2121
"""
2222
Time-based rotating logger with context manager support for automatic resource cleanup.
2323
@@ -94,22 +94,6 @@ def init(self):
9494
register_logger_weakref(logger)
9595
return logger
9696

97-
def __enter__(self):
98-
"""Context manager entry."""
99-
if not hasattr(self, 'logger') or self.logger is None:
100-
self.init()
101-
return self.logger
102-
103-
def __exit__(self, exc_type, exc_val, exc_tb):
104-
"""Context manager exit with automatic cleanup."""
105-
if hasattr(self, 'logger'):
106-
cleanup_logger_handlers(self.logger)
107-
108-
@staticmethod
109-
def cleanup_logger(logger: logging.Logger) -> None:
110-
"""Static method for cleaning up logger resources."""
111-
cleanup_logger_handlers(logger)
112-
11397

11498
class GZipRotatorTimed:
11599
def __init__(self, dir_logs: str, days_to_keep: int):

0 commit comments

Comments
 (0)