|
| 1 | +__author__ = "desultory" |
| 2 | +__version__ = "1.1.0" |
| 3 | + |
| 4 | +from .colorlognameformatter import ColorLognameFormatter |
| 5 | + |
| 6 | +from logging import Logger, getLogger, StreamHandler |
| 7 | +from sys import modules |
| 8 | + |
| 9 | + |
| 10 | +def _has_handler(logger): |
| 11 | + while logger: |
| 12 | + if logger.handlers: |
| 13 | + return True |
| 14 | + logger = logger.parent |
| 15 | + return False |
| 16 | + |
| 17 | + |
| 18 | +class ClassLogger: |
| 19 | + def __init__(self, logger=None, _log_bump=0, *args, **kwargs): |
| 20 | + # Get the parent logger from the root if one was not passed |
| 21 | + parent_logger = logger if isinstance(logger, Logger) else getLogger() |
| 22 | + # Get a child logger from the parent logger, set self.logger |
| 23 | + self.logger = parent_logger.getChild(self.__class__.__name__) |
| 24 | + # Bump the log level if _log_bump is passed |
| 25 | + self.logger.setLevel(self.logger.parent.level + _log_bump) |
| 26 | + |
| 27 | + # Add a colored stream handler if one does not exist |
| 28 | + if not _has_handler(self.logger): |
| 29 | + color_stream_handler = StreamHandler() |
| 30 | + color_stream_handler.setFormatter(ColorLognameFormatter(fmt='%(levelname)s | %(name)-42s | %(message)s')) |
| 31 | + self.logger.addHandler(color_stream_handler) |
| 32 | + self.logger.info("Adding default handler: %s" % self.logger) |
| 33 | + |
| 34 | + # Log class init if _log_init is passed |
| 35 | + if kwargs.pop('_log_init', True) is True: |
| 36 | + self.logger.info("Intializing class: %s" % self.__class__.__name__) |
| 37 | + self.logger.debug("Log level: %s" % self.logger.level) |
| 38 | + |
| 39 | + if args: |
| 40 | + self.logger.debug("Args: %s" % repr(args)) |
| 41 | + if kwargs: |
| 42 | + self.logger.debug("Kwargs: %s" % repr(kwargs)) |
| 43 | + if module_version := getattr(modules[self.__module__], '__version__', None): |
| 44 | + self.logger.info("Module version: %s" % module_version) |
| 45 | + if class_version := getattr(self, '__version__', None): |
| 46 | + self.logger.info("Class version: %s" % class_version) |
| 47 | + else: |
| 48 | + self.logger.log(5, "Init debug logging disabled for: %s" % self.__name__) |
| 49 | + |
| 50 | + def __setattr__(self, name, value): |
| 51 | + """ Add logging to setattr. """ |
| 52 | + super().__setattr__(name, value) |
| 53 | + |
| 54 | + # Check if the logger is defined |
| 55 | + if not hasattr(self, 'logger') or not isinstance(self.logger, Logger): |
| 56 | + return |
| 57 | + |
| 58 | + if isinstance(value, list) or isinstance(value, dict) or isinstance(value, str) and "\n" in value: |
| 59 | + self.logger.log(5, "Setattr '%s' to:\n%s" % (name, getattr(self, name))) |
| 60 | + else: |
| 61 | + self.logger.log(5, "Setattr '%s' to: %s" % (name, getattr(self, name))) |
| 62 | + |
| 63 | + def __setitem__(self, name, value): |
| 64 | + """ Add logging to dict setitem. """ |
| 65 | + if hasattr(super(), '__setitem__'): |
| 66 | + super().__setitem__(name, value) |
| 67 | + self.logger.log(5, "Setitem '%s' to: %s" % (name, value)) |
0 commit comments