4

我开发并维护了一个有 2000 多个用户的付费出版物。最常见的支持请求与登录有关。大多数情况下,这些可以通过几封支持电子邮件来解决。但是,每隔一段时间,就会有一个奇怪的用户无法登录。作为最后的手段,支持人员会重置用户密码,验证他们是否可以自己登录并将新凭据发送给用户。我们时不时地遇到仍然无法登录的用户。那时我已经没有故障排除工具了。

所以我想要一个工具:

  1. 完整记录所有 HTTP 请求(用户密码除外)。

  2. 让我在日志中搜索包含用户名的登录页面的 POST 请求。

  3. 让我看看我在步骤 2 中在特定时间范围内找到的来自 IP 地址的所有请求,然后非常仔细地分析这些请求。

而且我需要能够进行智能日志轮换,例如:“保留可以放入 30 GB 的所有内容,然后开始扔掉旧的东西”。

我们的出版物恰好是用 Django 和 nginx 构建的,但我认为我正在寻找的工具不会特定于这些工具。而且我绝对不想将所有请求数据与我的 Django 应用程序放在同一个 SQL 数据库中。

到目前为止,我已经找到了 Logstash,但我还没有仔细研究它是否适合我。对我来说重要的不是获得所有使用情况、用户趋势、转化渠道等的漂亮图表。我需要的是更好的方法来解决影响单个用户的问题。

4

4 回答 4

7

我认为最好的选择是使用一套 Logstash(事件收集)+ Elasticsearch(事件存储)+ Kibana(分析)。这三个都是非常好的开源项目,有很多文档和非常活跃的社区。

如果您需要任何商业支持,您可以从以下网址请求帮助:http ://www.elasticsearch.org/

Logstash 足够灵活,可以让您开箱即用地解析许多日志文件格式。此外,将所有日志存储在弹性搜索上将允许您创建自定义查询、报告和内容。

您可以在以下位置查看 kibana 演示:http ://demo.kibana.org/

链接: http : //www.elasticsearch.org/overview/kibana/ http://logstash.net/

于 2013-12-11T14:43:41.273 回答
2

作为暂时的事情,这可能不需要任何复杂的解决方案。

我成功地将这个快速而肮脏的 Django 中间件用于非常相似的目的 - https://gist.github.com/Suor/7870909

于 2013-12-09T11:35:14.477 回答
2

你给哨兵看了吗?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) '

但是,这要求您首先记录所有这些信息。我认为没有一刀切的模型,因为使用中间件,您将记录每个请求的所有内容,而不仅仅是您的身份验证视图。通过更详细地记录您正在验证的位置,您实际上会得到有效的结果。

于 2013-12-11T00:46:01.627 回答
1

有几种方法可以在 django 中处理

向 django 应用程序添加一个中间件,该应用程序记录请求和请求中所需的所有数据,即request.POST它是 POSTrequest.GET还是 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.RequestLoggingMiddlewareMIDDLEWARE_CLASSES.

与此相关的内容列在是否有 Django 中间件/插件以有组织的方式记录我的所有请求?https://github.com/kylef/django-request

另一种选择是添加一个日志处理程序,用于记录该错误的请求。日志级别可以更改为调试以记录所有请求

来自官方文档

django.request 记录与请求处理相关的消息。5XX 响应作为错误消息引发;4XX 响应作为警告消息引发。

此记录器的消息具有以下额外上下文:

status_code:与请求关联的 HTTP 响应代码。request:生成日志消息的请求对象。

将以下处理程序添加到您的日志字典配置文件中。

'django.request':
        {
            'handlers':
                ['mail_admins', 'console', 'file'],
            'level':
                'ERROR',
            'propagate':
                False,
        },

一旦您设置了日志记录请求,并将您的日志收集到某个地方,就有不同的方法来分析它们。我使用Logentries收集我的日志并提供一个界面,我可以在其中按时间过滤并进行grep类似的搜索。有时,当这还不够时,我将日志下载为 tar,并使用本地运行的具有更好搜索工具的Splunk版本。但只要能按时间过滤,找到合适的请求日志,应该就能调试出发生了什么。

于 2013-12-13T10:29:23.150 回答