Ошибки журнала Django и обратная трассировка в файле в рабочей среде

#python #django

Вопрос:

Я совсем новичок в работе с регистрацией в django, я выполняю производственное развертывание (DEBUG=False) приложения, но мне не разрешено использовать какой-либо трекер ошибок, такой как Sentry, для выявления возможных проблем, поэтому мне было интересно, можно ли записать обратную трассировку или ее часть в производственной среде в файл с помощью регистратора.

Я сделал что-то подобное в своих производственных настройках:

 import logging.config
# Clear prev config
LOGGING_CONFIG = None

# Get loglevel from env
LOGLEVEL = os.getenv('DJANGO_LOGLEVEL', 'debug').upper()

logging.config.dictConfig(
        {
            'version': 1,
            'disable_existing_loggers': False,
            'filters': {
                'require_debug_false': {
                    '()': 'django.utils.log.RequireDebugFalse',
                },
                'require_debug_true': {
                    '()': 'django.utils.log.RequireDebugTrue',
                },
            },

            'handlers': {
                'console': {
                    'level': 'INFO',
                    'filters': ['require_debug_false'],
                    'class': 'logging.StreamHandler',
                },
                'file': {
                    'level': 'DEBUG',
                    'class': 'logging.FileHandler',
                    'filename': 'debug.log',
                },
            },
            'loggers': {
                "": {
                    "level": "ERROR",
                    "handlers": ["console", "file"],
                },

                'django': {
                    'handlers': ['console', 'file'],
                    'level': 'DEBUG',
                    'propagate': True,
                },
                'django.request': {
                    'handlers': ['console', 'file'],
                    'propagate': True,
                    'level': 'ERROR',
                },
            }
        }
    )
 

Но единственное, что у меня получилось, — это отладка.журнал является:

 Internal Server Error: /job/create/
Internal Server Error: /job/create/
Internal Server Error: /job/create/
 

Журналы в файл без какой-либо другой информации, я хотел бы иметь некоторую значимую информацию при отладке.войдите, чтобы иметь представление о том, где может быть ошибка, это то, что я хотел бы получить:

 [2021-07-27 23:47:29  0000] [ERROR] Internal Server Error: /job/create/ 
AttributeError
'str' object has no attribute 'strftime'
jobs/views.py in CreateJob at line 29
[2021-07-27 23:49:18  0000] [ERROR] Internal Server Error: /job/create/ 
AttributeError
'str' object has no attribute 'strftime'
jobs/views.py in CreateJob at line 29
 

Есть ли способ добиться этого с помощью ведения журнала? Или как я могу получить обратную трассировку или резюме обратной трассировки в случае возможных ошибок в производственной среде без таких сервисов, как Sentry?

Ответ №1:

Вы можете определить формат ведения журнала и добавить его в свой обработчик.

Для вашего примера это может выглядеть так:

 'formatters': {
    'mystyle': {
        'format': u'%(asctime)s %(levelname)-6s %(lineno)-4s%(name)-15s %(message)s',
        'datefmt': '%H:%M:%S',
    },
'handlers': {
    'console': {...},
    'file': {
        'level': 'DEBUG',
        'class': 'logging.FileHandler',
        'filename': 'debug.log',
        'format': 'mystyle',
    },
},
 

Форматер определен в отдельном разделе, чтобы сделать его многоразовым. Т. е. несколько обработчиков могут использовать один и тот же форматер.
Список того, что вы можете использовать в качестве заполнителей в своем формате, можно найти здесь (я думаю, что есть что-то вроде трассировки стека).:

https://docs.python.org/3/library/logging.html#logrecord-attributes