Как сделать запись HTTP-запроса как средство устранения ошибок входа в систему

Я разрабатываю и поддерживаю платную публикацию с более чем 2000 пользователями. Наиболее распространенный запрос поддержки относится к входу в систему. В большинстве случаев это можно решить с помощью пары писем поддержки. Время от времени, тем не менее, появляется тот странный пользователь, который просто не может войти в систему. В качестве последнего средства служба поддержки сбрасывает пароль пользователей, проверяет, могут ли они войти в систему и отправлять новые учетные данные пользователю. Время от времени мы получаем пользователя, который все еще не может войти в систему. В этот момент у меня нет инструментов для устранения неполадок.

Поэтому я хотел бы иметь инструмент, который:

  1. Регистрирует все HTTP-запросы полностью (кроме паролей пользователей).

  2. Давайте поищем в журнале запрос POST на мою страницу входа, содержащую имя пользователя.

  3. Позвольте мне взглянуть на все запросы с 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, работающую локально, с лучшими инструментами поиска. Но пока вы можете фильтровать по времени и находить соответствующие журналы запросов, вы сможете отлаживать происходящее.

Другие вопросы по тегам