Как сделать запись HTTP-запроса как средство устранения ошибок входа в систему
Я разрабатываю и поддерживаю платную публикацию с более чем 2000 пользователями. Наиболее распространенный запрос поддержки относится к входу в систему. В большинстве случаев это можно решить с помощью пары писем поддержки. Время от времени, тем не менее, появляется тот странный пользователь, который просто не может войти в систему. В качестве последнего средства служба поддержки сбрасывает пароль пользователей, проверяет, могут ли они войти в систему и отправлять новые учетные данные пользователю. Время от времени мы получаем пользователя, который все еще не может войти в систему. В этот момент у меня нет инструментов для устранения неполадок.
Поэтому я хотел бы иметь инструмент, который:
Регистрирует все HTTP-запросы полностью (кроме паролей пользователей).
Давайте поищем в журнале запрос POST на мою страницу входа, содержащую имя пользователя.
Позвольте мне взглянуть на все запросы с IP-адреса, найденного на шаге 2, в течение определенного периода времени, а затем проанализировать эти запросы очень внимательно.
И мне нужно уметь делать умный ротации логов, например: "Держись за все, что можно уместить в 30 ГБ, а затем начать выбрасывать старые вещи".
Наша публикация построена с использованием Django и nginx, но я не думаю, что инструмент, который я ищу, будет специфичным для этих инструментов. И я определенно не хочу бросать все данные запроса в ту же базу данных SQL, что и мое приложение Django.
До сих пор я нашел Logstash, но я не достаточно внимательно изучил его, чтобы понять, подходит ли он мне. Для меня важно не получить хороший график всех показателей использования, тенденций пользователей, воронок конверсии и т. Д. Что мне нужно, так это лучшие способы устранения неполадок, затрагивающих одного пользователя.
4 ответа
Я думаю, что лучшим вариантом является использование набора Logstash (сбор событий) + Elasticsearch (хранение событий) + Kibana (аналитика). Все три - действительно хорошие проекты с открытым исходным кодом, с большим количеством документации и очень активными сообществами.
И если вам нужна коммерческая поддержка для любого из них, вы можете запросить помощь по адресу: http://www.elasticsearch.org/
Logstash достаточно гибок, чтобы вы могли анализировать многие форматы файлов журналов из коробки. Более того, хранение всех ваших журналов при упругом поиске позволит вам создавать собственные запросы, отчеты и прочее.
Вы можете посмотреть демоверсию кибаны на: http://demo.kibana.org/
Ссылки: http://www.elasticsearch.org/overview/kibana/ http://logstash.net/
Как временная вещь это, вероятно, не требует какого-либо сложного решения.
Я успешно использовал это быстрое и грязное промежуточное ПО Django для совершенно аналогичной цели - https://gist.github.com/Suor/7870909
Ты посмотрел на Стража? https://getsentry.com/welcome/ и https://github.com/getsentry/raven-python. Это может быть излишним для вашей проблемы, хотя. Почему бы просто не внедрить более подробное ведение журнала в своих методах аутентификации и настроить отдельный регистратор только для сбоев аутентификации?
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': ('[%(levelname)s] - %(asctime)s - %(module)s: '
'%(process)d %(thread)d %(message)s')
},
},
'handlers': {
'auth': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler',
'formatter': 'verbose',
'filename': os.path.join(someloglocation, 'auth.log'),
'maxBytes': 1024*1024*3,
'backupCount': 10,
},
},
'loggers': {
'auth': {
'handlers': ['console', 'auth'],
'level': 'DEBUG',
'propagate': True,
},
},
}
Похоже, было бы проще изменить уровень журнала с DEBUG на WARN или наоборот, чем реализовать некоторые настройки ведения журналов, которые излишни для ваших потребностей. Что касается поиска по ip или имени пользователя:
cat auth.log | grep <ip address> | egrep -v ' (200|301|302|304) '
cat auth.log | grep <username> | egrep -v ' (200|301|302|304) '
Это, однако, требует, чтобы вы регистрировали всю эту информацию в первую очередь. Я не думаю, что для этого есть одна модель, подходящая для всех моделей, потому что с промежуточным ПО вы будете регистрировать все для каждого запроса, а не только для ваших просмотров аутентификации. Более детально войдя в учетную запись, где вы проходите аутентификацию, вы получите действительные результаты.
Есть несколько способов сделать это в Django
Добавьте промежуточное ПО в приложение django, которое регистрирует запрос и все необходимые данные из запроса, т.е. request.POST
если это ПОСТ и request.GET
если это ПОЛУЧИТЬ.
В файле с именем middleware.py
import logging
logger = logging.getLogger('app')
class RequestLoggingMiddleware:
def process_request(self, request):
logger.debug(request)
logger.debug('Logged Request')
return None
В вашем settings.py
, добавлять middleware.RequestLoggingMiddleware
к MIDDLEWARE_CLASSES
,
Что-то, связанное с этим, перечислено в: Есть ли промежуточное ПО / плагин Django, который регистрирует все мои запросы организованным способом? и https://github.com/kylef/django-request
Другой вариант - добавить обработчик журналов, который регистрирует запросы с этой ошибкой. Уровень ведения журнала можно изменить на отладочный, чтобы регистрировать все запросы
django.request Журнал сообщений, связанных с обработкой запросов. Ответы 5XX выдаются как сообщения об ошибках; Ответы 4XX выдаются как предупреждающие сообщения.
Сообщения для этого регистратора имеют следующий дополнительный контекст:
status_code: код ответа HTTP, связанный с запросом. запрос: объект запроса, который сгенерировал сообщение регистрации.
Добавьте приведенный ниже обработчик в ваш файл конфигурации log dict.
'django.request':
{
'handlers':
['mail_admins', 'console', 'file'],
'level':
'ERROR',
'propagate':
False,
},
После того, как вы настроили запросы на регистрацию, и ваши журналы собираются где-то, есть разные способы их проанализировать. Я использую Logentries, который собирает мои логи и предоставляет интерфейс, где я могу фильтровать по времени и делать grep
нравится поиск. Иногда, когда этого недостаточно, я загружаю журналы как tar и использую версию Splunk, работающую локально, с лучшими инструментами поиска. Но пока вы можете фильтровать по времени и находить соответствующие журналы запросов, вы сможете отлаживать происходящее.