django - 如何通过日志记录筛选出GET静态和媒体消息?

Mar*_*era 14 django logging

我正在处理一个包含大量图像的页面,因此这会在此类型的控制台中生成大量输出.在我的开发环境中,我使用django来提供静态和媒体服务,所以我在我的控制台中得到了很多:

...
[23/May/2014 12:41:54] "GET /static/css/style.css HTTP/1.1" 304 0
[23/May/2014 12:41:55] "GET /static/js/jquery-1.7.1.min.js HTTP/1.1" 304 0
[23/May/2014 12:41:55] "GET /static/js/jquery.form.js HTTP/1.1" 304 0
...
[23/May/2014 12:41:57] "GET /media/producto/Tapa_Santiago_Vazquez_SV.jpg HTTP/1.1" 304 0
[23/May/2014 12:41:57] "GET /media/CACHE/images/producto/Barcos_y_mariposas_DVD_baja/2e3e3894ca08f88c03459e00f9018427.jpg HTTP/1.1" 304 0
[23/May/2014 12:41:56] "GET /media/CACHE/images/producto/tapaDEJA_VU/fb67e92ffd47808a263db02ca016bc24.jpg HTTP/1.1" 304 0
...
Run Code Online (Sandbox Code Playgroud)

寻找有意义的输出非常繁琐.

我想在我的环境中过滤掉那些消息,所以我只看到了视图和输出的GET,但到目前为止看到我看到的日志记录,我可能会影响来自django的其他日志记录但不是这个.我甚至试过这个,但它不起作用:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': True,
    'handlers': {
        'null': {
            'level': 'ERROR',
            'class': 'django.utils.log.NullHandler',
        },
    },
    'loggers': {
        'django': {
            'handlers': ['null'],
            'level': 'ERROR',
            'propagate': True,
        },
    }
}
Run Code Online (Sandbox Code Playgroud)

甚至可以过滤掉那种输出吗?

谢谢!!

tin*_*ino 14

最新版本的Django使用您自己的LOGGING设置覆盖默认日志记录非常容易.

要筛选出对/static/目录的所有GET请求,请将以下内容添加到settings.py:

def skip_static_requests(record):
    if record.args[0].startswith('GET /static/'):  # filter whatever you want
        return False
    return True

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
        # use Django's built in CallbackFilter to point to your filter 
        'skip_static_requests': {
            '()': 'django.utils.log.CallbackFilter',
            'callback': skip_static_requests
        }
    },
    'formatters': {
        # django's default formatter
        'django.server': {
            '()': 'django.utils.log.ServerFormatter',
            'format': '[%(server_time)s] %(message)s',
        }
    },
    'handlers': {
        # django's default handler...
        'django.server': {
            'level': 'INFO',
            'filters': ['skip_static_requests'],  # <- ...with one change
            'class': 'logging.StreamHandler',
            'formatter': 'django.server',
        },
    },
    'loggers': {
        # django's default logger
        'django.server': {
            'handlers': ['django.server'],
            'level': 'INFO',
            'propagate': False,
        },
    }
}
Run Code Online (Sandbox Code Playgroud)

以下是1.10版本中Django的所有默认记录器,你可以用同样的方式覆盖它们:https: //github.com/django/django/blob/32265361279b3316f5bce8efa71f2049409461e3/django/utils/log.py#L18

以下是Django默认内置记录器的功能描述:https: //docs.djangoproject.com/en/1.10/topics/logging/#id3

以下是Django CallbackFilter上面用于挂钩自定义过滤器的文档:https: //docs.djangoproject.com/en/1.10/topics/logging/#django.utils.log.CallbackFilter

  • 不错的解决方案!在我的例子中,`record.args[0]` 有时是一个元组(例如在“broken pipe”日志消息上),所以我使用以下 lambda 内联而不是你的 `skip_static_requests()` 函数:`lambda 记录:不是 isinstance(record.args[0], basestring) 或不是 any([record.args[0].startswith('GET ' + prefix) for prefix in ['/static/']])`。 (2认同)