From ad10e269d8942bbf9e08248cfb58c37978218a55 Mon Sep 17 00:00:00 2001 From: wad Date: Mon, 23 Apr 2018 16:01:44 +0300 Subject: [PATCH] =?UTF-8?q?yandex=5Flogger=20=D0=BF=D0=BE=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D1=8F=D0=BB=20=D0=BD=D0=B0=20FinanceLogger?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config_app/management/commands/for_test.py | 5 +- finance/loggers.py | 12 +- .../commands/yandex_repeat_payment.py | 7 +- finance/tasks.py | 16 ++- finance/views.py | 105 +++++++----------- 5 files changed, 62 insertions(+), 83 deletions(-) diff --git a/config_app/management/commands/for_test.py b/config_app/management/commands/for_test.py index c4e5724..64425fe 100644 --- a/config_app/management/commands/for_test.py +++ b/config_app/management/commands/for_test.py @@ -1,17 +1,16 @@ from django.core.management.base import BaseCommand -from finance.loggers import FinanceLogger - 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('logger_yandex test log record', extra={'asdf': 3246523}, + logger.exception('FinanceLogger test log record', extra={'asdf': 3246523}, invoice_id=42, exc={'a': 1, 'b': 3, 'привет': 'медвед'} ) diff --git a/finance/loggers.py b/finance/loggers.py index 29c3b79..c81ebd0 100644 --- a/finance/loggers.py +++ b/finance/loggers.py @@ -11,8 +11,16 @@ class FinanceLogger: '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=msg, *args, **self._make_kwargs(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 = {} @@ -45,4 +53,4 @@ class FinanceLogger: def exception(self, msg, *args, **kwargs): kwargs['stack_info'] = True - _logger.exception(msg, *args, **self._make_kwargs(kwargs)) + _logger.exception(self._get_msg(msg), *args, **self._make_kwargs(kwargs)) diff --git a/finance/management/commands/yandex_repeat_payment.py b/finance/management/commands/yandex_repeat_payment.py index bba2624..7e2fd49 100644 --- a/finance/management/commands/yandex_repeat_payment.py +++ b/finance/management/commands/yandex_repeat_payment.py @@ -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() diff --git a/finance/tasks.py b/finance/tasks.py index 4577298..6977e98 100644 --- a/finance/tasks.py +++ b/finance/tasks.py @@ -7,15 +7,15 @@ from django.db import transaction from django.utils import timezone from yandex_money.models import Payment +from finance.loggers import FinanceLogger from finance.models import InvoiceRebilling from lms import celery_app -logger_yandex = logging.getLogger('yandex_money') - +finance_logger = FinanceLogger() @celery_app.task def periodic_billing(): - logger_yandex.info("start periodic billing task") + finance_logger.info("start periodic billing task") invoices = InvoiceRebilling.objects.filter(method='Y').exclude(status='F') for invoice in invoices.filter(expected_date__lt=timezone.now()): # выбираем все необработанные из прошлого @@ -23,9 +23,7 @@ def periodic_billing(): try: _yandex_repeat_card_payment(invoice) except Exception as exc: - logger_yandex.critical('periodic billing Exception', exc_info=True, extra={ - 'invoice id': invoice.id, 'exc': exc - }) + finance_logger.exception('YandexMoney repeatCardPayment Exception', invoice_id=invoice.id) invoice.comment = 'Ошибка при попытке повторного платежа, свяжитесь с клиентской службой' invoice.save() @@ -42,6 +40,7 @@ def _yandex_repeat_card_payment(invoice): ) invoice.yandex_pay = yandex_pay + finance_logger.info('YandexMoney repeatCardPayment start', invoice_id=invoice.id) resp = requests.post( url=settings.YANDEX_MONEY_MWS_URL + 'repeatCardPayment', data={ @@ -57,6 +56,5 @@ def _yandex_repeat_card_payment(invoice): verify=os.path.join(settings.SSL_ROOT, 'yamoney_chain.cer') ) # TODO тут проверять нет ли ошибки яндекса (даже при 200 ответе) - logger_yandex.info('periodic billing finish', exc_info=True, extra={ - 'response': resp.text, 'code': resp.status_code, - }) + finance_logger.info('YandexMoney repeatCardPayment ended', + invoice_id=invoice.id, response=resp.text, code=resp.status_code, ) diff --git a/finance/views.py b/finance/views.py index a79b009..31fdd34 100644 --- a/finance/views.py +++ b/finance/views.py @@ -1,32 +1,32 @@ import csv -import logging +import uuid import requests +from django.conf import settings from django.contrib.auth import get_user_model from django.core.mail import EmailMessage +from django.core.mail import EmailMultiAlternatives from django.db import IntegrityError from django.db.models import Q from django.http import HttpResponse, HttpResponseForbidden from django.shortcuts import redirect, render_to_response +from django.template.loader import render_to_string +from django.utils import timezone +from django.utils.html import strip_tags from rest_framework.renderers import JSONRenderer from rest_framework.response import Response from rest_framework.views import APIView from yandex_money.models import Payment -from django.conf import settings -from django.core.mail import EmailMultiAlternatives -from django.template.loader import render_to_string -from django.utils.html import strip_tags -from courses.models import Course from courses.api import CourseParamsApi +from courses.models import Course +from finance.loggers import FinanceLogger from finance.models import Bill, Invoice, InvoiceRebilling from finance.serializers import BillSerializer, InvoiceSerializer from lms.global_decorators import transaction_decorator from lms.tools import get_real_name -from django.utils import timezone -import uuid -logger_yandex = logging.getLogger('yandex_money') +finance_logger = FinanceLogger() # prefix='YandexMoney' def test_pay(request): @@ -337,9 +337,7 @@ class YandexPay(APIView): msg.send() except Exception as exc: - logger_yandex.error('YandexPay: Email not sended', exc_info=True, extra={ - 'exc': exc - }) + finance_logger.exception('YandexPay: Email not sended') return redirect(r.url) @@ -395,41 +393,35 @@ class YandexCheckView(APIView): val = i.split('=')[1] data[key] = val - logger_yandex.info('Проверка платежа запрос', exc_info=True, extra={ - 'request': data, - }) + finance_logger.info('Проверка платежа запрос', request=data) + order_number = data['orderNumber'] try: - pay = Payment.objects.get(order_number=data['orderNumber']) + pay = Payment.objects.get(order_number=order_number) except Payment.DoesNotExist: - logger_yandex.error('Ошибка проверки платежа', exc_info=True, extra={ - 'request': "Payment with id=%s not found" % data['orderNumber'], - }) + finance_logger.error('Ошибка проверки платежа', exc_info=True, + request="Payment with id=%s not found" % order_number) return Response(status=204) if not pay.status == Payment.STATUS.PROCESSED: - logger_yandex.error('Ошибка проверки платежа', exc_info=True, extra={ - 'request': "Payment with id=%s have status %s" % (data['orderNumber'], pay.status), - }) + finance_logger.error('Ошибка проверки платежа', + order_number=order_number, + request="Payment with id=%s have status %s" % (order_number, pay.status)) return Response(status=204) if not pay.shop_id == int(data['shopId']): - logger_yandex.error('Ошибка проверки платежа', exc_info=True, extra={ - 'request': "ShopId=%s not match" % (data['shopId'],), - }) + finance_logger.error('Ошибка проверки платежа', + request="ShopId=%s not match" % (data['shopId'],)) return Response(status=204) if not pay.scid == int(data['scid']): - logger_yandex.error('Ошибка проверки платежа', exc_info=True, extra={ - 'request': "scid=%s not match" % (data['scid'],) - }) + finance_logger.error('Ошибка проверки платежа', + request="scid=%s not match" % (data['scid'],)) return Response(status=204) if not pay.order_amount == float(data['orderSumAmount']): - logger_yandex.error('Ошибка проверки платежа', exc_info=True, extra={ - 'request': "Expected amount is %s received amount is %s" - % (pay.order_amount, data['orderSumAmount']), - }) + finance_logger.error('Ошибка проверки платежа', + request="Expected amount is %s received amount is %s" % (pay.order_amount, data['orderSumAmount'])) return Response(status=204) now = timezone.now() @@ -439,9 +431,7 @@ class YandexCheckView(APIView): xml_res = """ """ % (pay.performed_datetime, str(data['invoiceId']), str(pay.shop_id)) - logger_yandex.info('Проверка платежа ответ', exc_info=True, extra={ - 'response': xml_res, - }) + finance_logger.info('Проверка платежа ответ', response=xml_res) return HttpResponse(xml_res, content_type='application/xml') @@ -457,17 +447,16 @@ class YandexAvisoView(APIView): val = i.split('=')[1] data[key] = val + order_number = data['orderNumber'] try: - pay = Payment.objects.get(order_number=data['orderNumber']) + pay = Payment.objects.get(order_number=order_number) except Payment.DoesNotExist: - logger_yandex.error('Ошибка подтверждения платежа', exc_info=True, extra={ - 'request': "Payment with invoice_id=%s not found" % data['orderNumber'], - }) + finance_logger.error('Ошибка подтверждения платежа', exc_info=True, + request="Payment with invoice_id=%s not found" % order_number) return Response(status=204) - logger_yandex.info('Подтверждение платежа запрос', exc_info=True, extra={ - 'request': 'Get success pay with invoice_id(yandex) %s' % str(data['invoiceId']), - }) + finance_logger.info('Подтверждение платежа запрос', + request='Get success pay with invoice_id(yandex) %s' % str(data['invoiceId'])) pay.shop_amount = data['shopSumAmount'] # invoice = pay.invoice @@ -481,9 +470,7 @@ class YandexAvisoView(APIView): xml_res = """ """ % (pay.performed_datetime, str(data['invoiceId']), str(pay.shop_id)) - logger_yandex.info('Подтверждение платежа ответ', exc_info=True, extra={ - 'response': xml_res, - }) + finance_logger.info('Подтверждение платежа ответ', response=xml_res) context = { 'user_email': pay.invoice.bill.user.email, @@ -518,7 +505,7 @@ class YandexFailView(APIView): val = i.split('=')[1] data[key] = val - logger_yandex.error(data) + finance_logger.error('YandexFailView', data=data) return redirect(to=settings.DOMAIN) @@ -536,12 +523,10 @@ class DemoYandexCheckView(APIView): val = i.split('=')[1] data[key] = val - logger_yandex.info('Проверка демо платежа запрос', exc_info=True, extra={ - 'request': data, - }) + finance_logger.info('Проверка демо платежа запрос', request=data) except IndexError: - logger_yandex.error("Непредвиденная ошибка проверки тестогого платежа") + finance_logger.exception("Непредвиденная ошибка проверки тестогого платежа") return Response(status=204) now = timezone.now() @@ -552,14 +537,10 @@ class DemoYandexCheckView(APIView): else: xml_res = """""" % (now.isoformat(), str(data['invoiceId']), str(data['shopId'])) - logger_yandex.warning( - "Ошибка проверки тестогого платежа" , exc_info=True, extra={ - "response": xml_res - } - ) + finance_logger.warning("Ошибка проверки тестового платежа", response=xml_res) return HttpResponse(xml_res, content_type='application/xml') except KeyError: - logger_yandex.error('Ошибка в данных checkYandex') + finance_logger.exception('Ошибка в данных checkYandex') return Response(status=204) @@ -567,7 +548,7 @@ class DemoYandexAvisoView(APIView): @staticmethod def post(request): - logger_yandex.info('Начало тестирования avisoYandex') + finance_logger.info('Начало тестирования avisoYandex') data = dict() for i in request.body.decode('utf-8').split('&'): key = i.split('=')[0] @@ -578,17 +559,11 @@ class DemoYandexAvisoView(APIView): if float(data['orderSumAmount']) < 1001: xml_res = """ """ % (now.isoformat(), str(data['invoiceId']), str(data['shopId'])) - logger_yandex.info('Подтверждение демо платежа ответ', exc_info=True, extra={ - 'response': xml_res, - }) + finance_logger.info('Подтверждение демо платежа ответ', response=xml_res) else: xml_res = """""" % (now.isoformat(), str(data['invoiceId']), str(data['shopId'])) - logger_yandex.warning( - "Ошибка подтверждения тестогого платежа", exc_info=True, extra={ - "response": xml_res - } - ) + finance_logger.warning("Ошибка подтверждения тестогого платежа", response=xml_res) return HttpResponse(xml_res, content_type='application/xml') \ No newline at end of file