рефактор переодической задачи: транзакционность, логирование и продолжение цикла по всем платежам See merge request !421remotes/origin/revert-6d879fe8
commit
6d879fe871
7 changed files with 177 additions and 128 deletions
@ -0,0 +1,16 @@ |
||||
from django.core.management.base import BaseCommand |
||||
|
||||
|
||||
class Command(BaseCommand): |
||||
help = 'Команда для тестов' |
||||
|
||||
def handle(self, *args, **options): |
||||
from finance.loggers import FinanceLogger |
||||
logger = FinanceLogger() |
||||
try: |
||||
10 / 0 |
||||
except Exception as exc: |
||||
logger.exception('FinanceLogger test log record', extra={'asdf': 3246523}, |
||||
invoice_id=42, exc={'a': 1, 'b': 3, 'привет': 'медвед'} |
||||
) |
||||
|
||||
@ -0,0 +1,56 @@ |
||||
# -*- 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)) |
||||
@ -1,15 +1,14 @@ |
||||
import logging |
||||
|
||||
from django.core.management.base import BaseCommand |
||||
|
||||
from finance.loggers import FinanceLogger |
||||
from finance.tasks import periodic_billing |
||||
|
||||
logger_yandex = logging.getLogger('yandex_money') |
||||
finance_logger = FinanceLogger() # prefix='YandexMoney' |
||||
|
||||
|
||||
class Command(BaseCommand): |
||||
|
||||
def handle(self, *args, **options): |
||||
logger_yandex.info("start console repeat payment command") |
||||
finance_logger.info("start console repeat payment command") |
||||
print('Started') |
||||
periodic_billing() |
||||
|
||||
Loading…
Reference in new issue