【问题标题】:django: How can I create a custom Logging Filter for SuspiciousOperation exception?django:如何为 SuspiciousOperation 异常创建自定义日志过滤器?
【发布时间】:2018-06-25 13:25:42
【问题描述】:

迁移到 1.11(从 1.8 开始)后,我从日志记录中收到了一些 SuspiciousOperation 错误。

它似乎来自 JS 请求,如果用户移动鼠标,该请求会保持会话处于活动状态。但这并不重要。

我怎样才能过滤这个异常?

我尝试了什么:

我刚刚在某处创建了一个过滤器:

import logging

from django.core.exceptions import SuspiciousOperation

class StopSuspiciousOperation(logging.Filter):
    def filter(self, record):
        if record.exc_info:
            exc_value = record.exc_info[1]
            return isinstance(exc_value, SuspiciousOperation)
        return True

然后我将此过滤器添加到我的配置中:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse',
        },
        'stop_suspicious_operation': {
            '()': 'aula.utils.loggingFilters.StopSuspiciousOperation',
        }
    },
    'handlers': {
        'mail_admins': {
            'level': 'ERROR',
            'filters': ['require_debug_false',
                        'stop_suspicious_operation',], #<-- here
            'class': 'django.utils.log.AdminEmailHandler'
        }
    },
    'loggers': {
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
    }
}

但我仍然收到错误消息:

内部服务器错误:/keepalive

SuspiciousOperation at /keepalive
The request's session was deleted before the request completed. The user may have logged out in a concurrent request, for example.

Request Method: GET
Request URL: https://XXXXXX/YYYYYY
Django Version: 1.11.9
Python Executable: /usr/bin/python
Python Version: 2.7.3

【问题讨论】:

    标签: django logging


    【解决方案1】:

    我不确定正确答案,但我认为 django 正在 WSGI 级别捕获 SuspiciousOperation 并记录错误。看: https://docs.djangoproject.com/en/dev/ref/exceptions/#suspiciousoperation

    如果 SuspiciousOperation 异常到达 WSGI 处理程序级别,它 记录在错误级别并导致 HttpResponseBadRequest。

    您可能只想过滤掉这样的错误请求:

    from logging import LogRecord
    
    
    def filter_400(record: LogRecord) -> bool:
        '''Filter out HTTP Error Code 400 Bad Request'''
        return record.status_code != 400
    

    【讨论】:

    • 是的,那会很聪明脸红我会编辑答案。
    • 无论如何,您的过滤器适用于所有 400 个操作。看看我的答案(我暂时取消删除只是为了给你看)那不起作用
    • 没错。它过滤 all 错误请求日志,这最终不是所需的行为。但你的答案不起作用。也可以按以下标准过滤:record.name != 'django.security.SuspiciousOperation'
    • 我知道我的答案不起作用,因为我删除了它:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    • 2023-03-16
    • 2020-11-07
    • 2018-02-09
    • 1970-01-01
    • 2016-09-24
    • 2012-08-19
    相关资源
    最近更新 更多