跳转到主要内容

Django中间件和日志过滤器,用于将唯一的ID附加到请求生成的每个日志消息。

项目描述

django-log-request-id

Django中间件和日志过滤器,用于将唯一的ID附加到请求生成的每个日志消息。

作者: Jamie Matthews, @j4mie

Build Status

示例

DEBUG [33031a43fc244539895fef70c433337e] myproject.apps.myapp.views: Doing something in a view
DEBUG [33031a43fc244539895fef70c433337e] myproject.apps.myapp.forms: The form validated successfully!
DEBUG [33031a43fc244539895fef70c433337e] myproject.apps.myapp.models: Doing some model magic
DEBUG [33031a43fc244539895fef70c433337e] myproject.apps.myapp.views: Redirecting to form success page

为什么?

这样你就可以在grep(或其他搜索方式)一组日志中搜索高流量应用程序的所有与单个请求相关的消息。

如何?

请求ID存储在线程本地中。 通常不认为线程本地是Django应用程序的最佳实践,但在此情况下似乎只有一种可行的方案。欢迎提交更好的想法的拉取请求。

还有其他实用功能吗?

在某些情况下,HTTP堆栈更高层的组件,如负载均衡器或代理,可能会生成请求ID。例如,Heroku的http-request-id功能 将名为 X_REQUEST_ID 的头添加到请求中。如果存在这样的头(并在您的设置中配置,见下文),则将使用该ID(而不是生成一个)。您可以根据需要配置设置以使用生成的ID或在没有可用时返回默认请求_id。

此外,该ID还会添加到传递给您的视图的HttpRequest对象中(作为request.id),以便您可以在应用程序中使用它。

安装和用法

首先,安装软件包:pip install django-log-request-id

将中间件添加到您的MIDDLEWARE_CLASSES设置中。它应该在最上面。

MIDDLEWARE_CLASSES = (
    'log_request_id.middleware.RequestIDMiddleware',
    # ... other middleware goes here
)

log_request_id.filters.RequestIDFilter 添加到您的 LOGGING 设置中。您还需要更新您的 formatters 以包括一个包含新 request_id 变量的格式,添加一个输出消息的处理程序(例如,输出到控制台),最后将处理程序附加到您应用程序的日志记录器。

如果以上内容没有意义,请查阅 Django 日志文档

以下是一个示例 LOGGING 设置

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
        'request_id': {
            '()': 'log_request_id.filters.RequestIDFilter'
        }
    },
    'formatters': {
        'standard': {
            'format': '%(levelname)-8s [%(asctime)s] [%(request_id)s] %(name)s: %(message)s'
        },
    },
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'filters': ['request_id'],
            'formatter': 'standard',
        },
    },
    'loggers': {
        'myapp': {
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': False,
        },
    }
}

然后您可以像往常一样输出日志消息

import logging
logger = logging.getLogger(__name__)
logger.debug("A wild log message appears!")

如果您想使用请求头中提供的 ID,请添加以下设置

LOG_REQUEST_ID_HEADER = "HTTP_X_REQUEST_ID"

如上设置此值将启用带有 X-Request-Id 头部的请求以头值进行日志记录。

注意,此值必须符合 Django META 键 的格式,否则将被忽略。

如果您希望当设置了 LOG_REQUEST_ID_HEADER 但请求中没有提供时回退到生成的 ID,请添加以下设置

GENERATE_REQUEST_ID_IF_NOT_IN_HEADER = True

如果您想在响应头中包含请求 ID,请添加以下设置,其中 RESPONSE_HEADER_NAME 是您将要使用的自定义头名称

REQUEST_ID_RESPONSE_HEADER = "RESPONSE_HEADER_NAME"

如果您想更改日志输出中的默认 request_id,请添加以下设置,其中 none(默认)是在缺失时的默认值。

NO_REQUEST_ID = "none"

记录所有请求

RequestIDMiddleware 还具有记录应用程序接收到的所有请求的能力,包括一些有用的信息,如用户 ID(如果存在)。要启用此功能,请将 LOG_REQUESTS = True 添加到您的设置中。消息被发送到 log_request_id.middleware 日志记录器,级别为 INFO

记录其他用户属性

如果您想记录用户 ID 而不是其他用户属性,可以使用 LOG_USER_ATTRIBUTE 设置。例如,要记录用户名,使用:LOG_USER_ATTRIBUTE = "username"。如果此设置设置为 None,则不会记录任何用户属性。

许可证

版权所有 © 2012,DabApps。

保留所有权利。

重新分发和使用源代码和二进制代码,无论是否修改,只要满足以下条件

源代码的重新分发必须保留上述版权声明、本条件列表和以下免责声明。二进制形式的重新分发必须在文档和/或其他与分发一起提供的材料中复制上述版权声明、本条件列表和以下免责声明。本软件由版权所有者和贡献者提供,“现状”且不提供任何明示或暗示的保证,包括但不限于适销性和适用于特定目的的保证。在任何情况下,版权所有者或贡献者均不对任何直接、间接、偶然、特殊、示范性或后果性的损害(包括但不限于替代商品或服务的采购;使用、数据或利润的损失;或业务中断)承担责任,无论是否已通知此类损害的可能性,无论损害是基于合同、严格责任还是侵权(包括疏忽或不计后果)。

行为准则

有关向此存储库贡献时的行为准则指南,请参阅 https://www.dabapps.com/open-source/code-of-conduct/

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪一个,请了解有关安装包的更多信息。

源分发

django-log-request-id-2.1.0.tar.gz (7.4 kB 查看哈希值)

上传时间

构建分发

django_log_request_id-2.1.0-py3-none-any.whl (8.5 kB 查看哈希值)

上传时间 Python 3