#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