# -*- coding: utf-8 -*- import logging _logger = logging.getLogger('finance_data') class FinanceLogger: """ Все kwargs попадют в %(finance_data)s и логируются 'format': '%(asctime)s - %(levelname)s - %(message)s - %(finance_data)s' """ def log(self, level, msg, *args, **kwargs): _logger.log(level=level, msg=msg, *args, **self._make_kwargs(kwargs)) def _make_kwargs(self, kwargs): new_kwargs = {} for inspected_kwarg in ('exc_info', 'stack_info', 'extra'): try: new_kwargs[inspected_kwarg] = kwargs.pop(inspected_kwarg) except KeyError: pass if 'extra' in new_kwargs: new_kwargs['extra']['finance_data'] = kwargs else: new_kwargs['extra'] = dict(finance_data=kwargs) return new_kwargs def debug(self, msg, *args, **kwargs): self.log(level=logging.DEBUG, msg=msg, *args, **kwargs) def info(self, msg, *args, **kwargs): self.log(level=logging.INFO, msg=msg, *args, **kwargs) def warning(self, msg, *args, **kwargs): self.log(level=logging.WARNING, msg=msg, *args, **kwargs) # TODO отделить логирование ошибок в другой лог def error(self, msg, *args, **kwargs): self.log(level=logging.ERROR, msg=msg, *args, **kwargs) def critical(self, msg, *args, **kwargs): self.log(level=logging.CRITICAL, msg=msg, *args, **kwargs) def exception(self, msg, *args, **kwargs): kwargs['stack_info'] = True _logger.exception(msg, *args, **self._make_kwargs(kwargs))