# -*- 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 __init__(self, prefix=None): self.prefix = prefix def log(self, level, msg, *args, **kwargs): _logger.log(level=level, msg=self._get_msg(msg), *args, **self._make_kwargs(kwargs)) def _get_msg(self, msg): if self.prefix: msg = '{}: {}'.format(self.prefix, msg) return msg 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(self._get_msg(msg), *args, **self._make_kwargs(kwargs))