diff --git a/config_app/management/commands/for_test.py b/config_app/management/commands/for_test.py new file mode 100644 index 0000000..c4e5724 --- /dev/null +++ b/config_app/management/commands/for_test.py @@ -0,0 +1,17 @@ +from django.core.management.base import BaseCommand + +from finance.loggers import FinanceLogger + + +class Command(BaseCommand): + help = 'Команда для тестов' + + def handle(self, *args, **options): + logger = FinanceLogger() + try: + 10 / 0 + except Exception as exc: + logger.exception('logger_yandex test log record', extra={'asdf': 3246523}, + invoice_id=42, exc={'a': 1, 'b': 3, 'привет': 'медвед'} + ) + diff --git a/finance/loggers.py b/finance/loggers.py new file mode 100644 index 0000000..29c3b79 --- /dev/null +++ b/finance/loggers.py @@ -0,0 +1,48 @@ +# -*- 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)) diff --git a/lms/settings.py b/lms/settings.py index 34493ef..5894e6f 100644 --- a/lms/settings.py +++ b/lms/settings.py @@ -206,6 +206,9 @@ LOGGING = { 'format': '%(levelname)s %(asctime)s %(module)s ' '%(process)d %(thread)d %(message)s' }, + 'finance_data_formatter': { + 'format': '%(asctime)s - %(levelname)s - %(message)s - %(finance_data)s' + }, }, 'handlers': { 'sentry': { @@ -213,15 +216,17 @@ LOGGING = { 'class': 'raven.contrib.django.raven_compat.handlers.SentryHandler', 'tags': {'custom-tag': 'x'}, }, - 'yandex_money': { + 'finance_data': { 'level': 'DEBUG', 'class': 'raven.contrib.django.raven_compat.handlers.SentryHandler', - 'tags': {'custom-tag': 'yandex'}, + 'tags': {'custom-tag': 'yandex'}, # TODO переделать на finance_data }, - 'yandex_money_file': { + 'finance_data_file': { 'level': 'INFO', - 'class': 'logging.FileHandler', - 'filename': os.path.join(BASE_DIR, 'logs', 'yandex_money.log'), + 'class': 'logging.handlers.RotatingFileHandler', + 'filename': os.path.join(BASE_DIR, 'logs', 'finance_data.log'), + 'maxBytes': 1024 * 1024 * 10, + 'formatter': 'finance_data_formatter' }, 'business_rules': { 'level': 'DEBUG', @@ -239,8 +244,8 @@ LOGGING = { 'level': 'WARNING', 'handlers': ['sentry'], }, - 'yandex_money': { - 'handlers': ['yandex_money', 'yandex_money_file', ], + 'finance_data': { + 'handlers': ['finance_data', 'finance_data_file', ], 'level': 'DEBUG', 'propagate': False },