log.py 1.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. # coding: utf-8
  2. import logging
  3. import sys
  4. import typing
  5. STREAM_HANDLER_TAG = '__STREAM_HANDLER__'
  6. class SynergineLogger(logging.getLoggerClass()):
  7. @property
  8. def is_debug(self) -> bool:
  9. return self.isEnabledFor(logging.DEBUG)
  10. def __getstate__(self):
  11. # Multiprocessing fail if stream handler present. Remove it if exist.
  12. # TODO Bug when want to store STREAM_HANDLER_TAG instead stream handler. str still in handlers after
  13. # __setstate__ ...
  14. self.handlers = []
  15. return self.__dict__.copy()
  16. def __setstate__(self, state):
  17. self.__dict__ = state
  18. # TODO: This handler is hardcoded, it must depend of real context
  19. self.handlers.append(logging.StreamHandler(sys.stdout))
  20. def get_default_logger(name: str='synergine', level: int=logging.ERROR) -> SynergineLogger:
  21. """
  22. WARNING: Set global logging Logger class to SynergineLogger
  23. """
  24. logging.setLoggerClass(SynergineLogger)
  25. logger = logging.getLogger(name)
  26. logger = typing.cast(SynergineLogger, logger)
  27. handler = logging.StreamHandler(sys.stdout)
  28. formatter = logging.Formatter('%(asctime)s|%(name)s|%(process)d|%(levelname)s: %(message)s')
  29. handler.setFormatter(formatter)
  30. logger.addHandler(handler)
  31. logger.setLevel(level)
  32. return logger