bruce-django-requests-logger


Namebruce-django-requests-logger JSON
Version 0.1.1 PyPI version JSON
download
home_pagehttps://github.com/yourusername/bruce-django-requests-logger
SummaryA Django middleware for comprehensive HTTP request logging
upload_time2025-11-02 06:26:25
maintainerNone
docs_urlNone
authorBruce
requires_python>=3.8
licenseNone
keywords django logging middleware request monitoring bruce
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Bruce Django Requests Logger

一个功能完整的 Django 中间件,用于详细记录 HTTP 请求信息。

## 功能特性

- 📝 记录完整的请求信息(方法、路径、状态码、持续时间等)
- 🕒 高精度时间测量和格式化显示
- 🌐 客户端 IP 地址检测(支持代理)
- 🔍 可配置的请求过滤(排除静态文件等)
- 🛠 管理命令查看日志统计
- 📊 JSON 格式的结构化日志输出
- ⚡ 轻量级,对性能影响极小

## 安装

### 使用 pip 安装

```bash
pip install bruce-django-requests-logger
```

### 使用方法
1. 添加到 INSTALLED_APPS
```aiignore
# settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    
    # 其他应用...
    
    # 添加 Bruce Django Requests Logger
    'bruce_django_requests_logger',
]
```
2.添加中间件
```aiignore
# settings.py

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    
    # 其他中间件...
    
    # 添加 Bruce Requests Logger 中间件
    # 建议放在其他中间件之前,以便准确测量整个请求处理时间
    'bruce_django_requests_logger.middleware.BruceRequestsLoggerMiddleware',
]
```
3. 基本使用
配置完成后,中间件会自动记录所有请求。启动 Django 开发服务器:
```aiignore
python manage.py runserver
```
访问您的 Django 应用任意页面,查看控制台输出,您将看到格式化的请求信息:
```aiignore
[BRUCE_REQUESTS_LOGGER] {
  "timestamp": "2024-01-01T10:00:00+08:00",
  "method": "GET",
  "path": "/admin/",
  "query_string": "",
  "status_code": 200,
  "duration": 0.145,
  "duration_formatted": "145ms",
  "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
  "ip_address": "172.18.0.1",
  "content_type": "text/html; charset=utf-8",
  "content_length": "12345"
}
```
4. 使用管理命令
```aiignore
# 查看最近的10条请求日志(默认)
python manage.py view_logs

# 查看最近5条GET请求
python manage.py view_logs --limit 5 --method GET

# 查看状态码为404的请求
python manage.py view_logs --status 404

# 查看最近20条日志
python manage.py view_logs --limit 20
```
### 日志字段说明
字段名	|说明	|示例
---|----|---
timestamp	|请求时间戳(ISO 8601 格式)	|"2024-01-01T10:00:00+08:00"
method	|HTTP 方法	|"GET", "POST", "PUT", "DELETE"
path|	请求路径	|"/admin/", "/api/users/"
query_string|	URL 查询参数|	"page=1&size=20"
status_code|	HTTP 状态码	|200, 404, 500
duration|	请求处理时间(秒)|	0.145
duration_formatted|	格式化后的处理时间	|"145ms"
user_agent	|客户端用户代理	|"Mozilla/5.0..."
ip_address	|客户端 IP 地址	|"172.18.0.1"
content_type|	响应内容类型|	"text/html; charset=utf-8"
content_length	|响应内容长度	|"12345"

### 高级配置
#### 自定义日志输出
您可以创建自定义中间件类来扩展或修改日志行为:
```aiignore
# your_app/middleware.py

from bruce_django_requests_logger.middleware import BruceRequestsLoggerMiddleware

class CustomRequestsLogger(BruceRequestsLoggerMiddleware):
    def _log_request(self, log_entry):
        # 自定义日志输出,例如写入文件或发送到日志服务
        custom_log = f"CUSTOM: {log_entry['method']} {log_entry['path']} - {log_entry['duration_formatted']}"
        print(custom_log)
        
        # 同时保留原始日志输出
        super()._log_request(log_entry)
```
然后在 settings.py 中使用您的自定义类:
```
MIDDLEWARE = [
    # ...
    'your_app.middleware.CustomRequestsLogger',  # 使用自定义中间件
]
```
### 排除特定路径
如果您希望排除某些路径的日志记录,可以创建自定义的请求检查函数:
```aiignore
# your_app/utils.py

from bruce_django_requests_logger.utils import should_log_request

def custom_should_log_request(request):
    # 排除健康检查路径和管理后台静态文件
    excluded_paths = ['/health/', '/admin/static/']
    
    for path in excluded_paths:
        if request.path.startswith(path):
            return False
    
    return should_log_request(request)
```
### 生产环境配置
在生产环境中,建议将日志输出重定向到文件:
```aiignore
# settings.py

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'file': {
            'level': 'INFO',
            'class': 'logging.FileHandler',
            'filename': '/var/log/django/requests.log',
            'formatter': 'verbose',
        },
    },
    'formatters': {
        'verbose': {
            'format': '{name} {levelname} {asctime} {message}',
            'style': '{',
        },
    },
    'loggers': {
        'bruce_django_requests_logger': {
            'handlers': ['file'],
            'level': 'INFO',
            'propagate': True,
        },
    },
}
```

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/yourusername/bruce-django-requests-logger",
    "name": "bruce-django-requests-logger",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": "django, logging, middleware, request, monitoring, bruce",
    "author": "Bruce",
    "author_email": "your.email@example.com",
    "download_url": "https://files.pythonhosted.org/packages/12/f5/c087866d3b6dc8a305f10581d4d3b333569763792665321cb871dbba0ddb/bruce_django_requests_logger-0.1.1.tar.gz",
    "platform": null,
    "description": "# Bruce Django Requests Logger\r\n\r\n\u4e00\u4e2a\u529f\u80fd\u5b8c\u6574\u7684 Django \u4e2d\u95f4\u4ef6\uff0c\u7528\u4e8e\u8be6\u7ec6\u8bb0\u5f55 HTTP \u8bf7\u6c42\u4fe1\u606f\u3002\r\n\r\n## \u529f\u80fd\u7279\u6027\r\n\r\n- \ud83d\udcdd \u8bb0\u5f55\u5b8c\u6574\u7684\u8bf7\u6c42\u4fe1\u606f\uff08\u65b9\u6cd5\u3001\u8def\u5f84\u3001\u72b6\u6001\u7801\u3001\u6301\u7eed\u65f6\u95f4\u7b49\uff09\r\n- \ud83d\udd52 \u9ad8\u7cbe\u5ea6\u65f6\u95f4\u6d4b\u91cf\u548c\u683c\u5f0f\u5316\u663e\u793a\r\n- \ud83c\udf10 \u5ba2\u6237\u7aef IP \u5730\u5740\u68c0\u6d4b\uff08\u652f\u6301\u4ee3\u7406\uff09\r\n- \ud83d\udd0d \u53ef\u914d\u7f6e\u7684\u8bf7\u6c42\u8fc7\u6ee4\uff08\u6392\u9664\u9759\u6001\u6587\u4ef6\u7b49\uff09\r\n- \ud83d\udee0 \u7ba1\u7406\u547d\u4ee4\u67e5\u770b\u65e5\u5fd7\u7edf\u8ba1\r\n- \ud83d\udcca JSON \u683c\u5f0f\u7684\u7ed3\u6784\u5316\u65e5\u5fd7\u8f93\u51fa\r\n- \u26a1 \u8f7b\u91cf\u7ea7\uff0c\u5bf9\u6027\u80fd\u5f71\u54cd\u6781\u5c0f\r\n\r\n## \u5b89\u88c5\r\n\r\n### \u4f7f\u7528 pip \u5b89\u88c5\r\n\r\n```bash\r\npip install bruce-django-requests-logger\r\n```\r\n\r\n### \u4f7f\u7528\u65b9\u6cd5\r\n1. \u6dfb\u52a0\u5230 INSTALLED_APPS\r\n```aiignore\r\n# settings.py\r\n\r\nINSTALLED_APPS = [\r\n    'django.contrib.admin',\r\n    'django.contrib.auth',\r\n    'django.contrib.contenttypes',\r\n    'django.contrib.sessions',\r\n    'django.contrib.messages',\r\n    'django.contrib.staticfiles',\r\n    \r\n    # \u5176\u4ed6\u5e94\u7528...\r\n    \r\n    # \u6dfb\u52a0 Bruce Django Requests Logger\r\n    'bruce_django_requests_logger',\r\n]\r\n```\r\n2.\u6dfb\u52a0\u4e2d\u95f4\u4ef6\r\n```aiignore\r\n# settings.py\r\n\r\nMIDDLEWARE = [\r\n    'django.middleware.security.SecurityMiddleware',\r\n    'django.contrib.sessions.middleware.SessionMiddleware',\r\n    'django.middleware.common.CommonMiddleware',\r\n    'django.middleware.csrf.CsrfViewMiddleware',\r\n    'django.contrib.auth.middleware.AuthenticationMiddleware',\r\n    'django.contrib.messages.middleware.MessageMiddleware',\r\n    'django.middleware.clickjacking.XFrameOptionsMiddleware',\r\n    \r\n    # \u5176\u4ed6\u4e2d\u95f4\u4ef6...\r\n    \r\n    # \u6dfb\u52a0 Bruce Requests Logger \u4e2d\u95f4\u4ef6\r\n    # \u5efa\u8bae\u653e\u5728\u5176\u4ed6\u4e2d\u95f4\u4ef6\u4e4b\u524d\uff0c\u4ee5\u4fbf\u51c6\u786e\u6d4b\u91cf\u6574\u4e2a\u8bf7\u6c42\u5904\u7406\u65f6\u95f4\r\n    'bruce_django_requests_logger.middleware.BruceRequestsLoggerMiddleware',\r\n]\r\n```\r\n3. \u57fa\u672c\u4f7f\u7528\r\n\u914d\u7f6e\u5b8c\u6210\u540e\uff0c\u4e2d\u95f4\u4ef6\u4f1a\u81ea\u52a8\u8bb0\u5f55\u6240\u6709\u8bf7\u6c42\u3002\u542f\u52a8 Django \u5f00\u53d1\u670d\u52a1\u5668\uff1a\r\n```aiignore\r\npython manage.py runserver\r\n```\r\n\u8bbf\u95ee\u60a8\u7684 Django \u5e94\u7528\u4efb\u610f\u9875\u9762\uff0c\u67e5\u770b\u63a7\u5236\u53f0\u8f93\u51fa\uff0c\u60a8\u5c06\u770b\u5230\u683c\u5f0f\u5316\u7684\u8bf7\u6c42\u4fe1\u606f\uff1a\r\n```aiignore\r\n[BRUCE_REQUESTS_LOGGER] {\r\n  \"timestamp\": \"2024-01-01T10:00:00+08:00\",\r\n  \"method\": \"GET\",\r\n  \"path\": \"/admin/\",\r\n  \"query_string\": \"\",\r\n  \"status_code\": 200,\r\n  \"duration\": 0.145,\r\n  \"duration_formatted\": \"145ms\",\r\n  \"user_agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36\",\r\n  \"ip_address\": \"172.18.0.1\",\r\n  \"content_type\": \"text/html; charset=utf-8\",\r\n  \"content_length\": \"12345\"\r\n}\r\n```\r\n4. \u4f7f\u7528\u7ba1\u7406\u547d\u4ee4\r\n```aiignore\r\n# \u67e5\u770b\u6700\u8fd1\u768410\u6761\u8bf7\u6c42\u65e5\u5fd7\uff08\u9ed8\u8ba4\uff09\r\npython manage.py view_logs\r\n\r\n# \u67e5\u770b\u6700\u8fd15\u6761GET\u8bf7\u6c42\r\npython manage.py view_logs --limit 5 --method GET\r\n\r\n# \u67e5\u770b\u72b6\u6001\u7801\u4e3a404\u7684\u8bf7\u6c42\r\npython manage.py view_logs --status 404\r\n\r\n# \u67e5\u770b\u6700\u8fd120\u6761\u65e5\u5fd7\r\npython manage.py view_logs --limit 20\r\n```\r\n### \u65e5\u5fd7\u5b57\u6bb5\u8bf4\u660e\r\n\u5b57\u6bb5\u540d\t|\u8bf4\u660e\t|\u793a\u4f8b\r\n---|----|---\r\ntimestamp\t|\u8bf7\u6c42\u65f6\u95f4\u6233\uff08ISO 8601 \u683c\u5f0f\uff09\t|\"2024-01-01T10:00:00+08:00\"\r\nmethod\t|HTTP \u65b9\u6cd5\t|\"GET\", \"POST\", \"PUT\", \"DELETE\"\r\npath|\t\u8bf7\u6c42\u8def\u5f84\t|\"/admin/\", \"/api/users/\"\r\nquery_string|\tURL \u67e5\u8be2\u53c2\u6570|\t\"page=1&size=20\"\r\nstatus_code|\tHTTP \u72b6\u6001\u7801\t|200, 404, 500\r\nduration|\t\u8bf7\u6c42\u5904\u7406\u65f6\u95f4\uff08\u79d2\uff09|\t0.145\r\nduration_formatted|\t\u683c\u5f0f\u5316\u540e\u7684\u5904\u7406\u65f6\u95f4\t|\"145ms\"\r\nuser_agent\t|\u5ba2\u6237\u7aef\u7528\u6237\u4ee3\u7406\t|\"Mozilla/5.0...\"\r\nip_address\t|\u5ba2\u6237\u7aef IP \u5730\u5740\t|\"172.18.0.1\"\r\ncontent_type|\t\u54cd\u5e94\u5185\u5bb9\u7c7b\u578b|\t\"text/html; charset=utf-8\"\r\ncontent_length\t|\u54cd\u5e94\u5185\u5bb9\u957f\u5ea6\t|\"12345\"\r\n\r\n### \u9ad8\u7ea7\u914d\u7f6e\r\n#### \u81ea\u5b9a\u4e49\u65e5\u5fd7\u8f93\u51fa\r\n\u60a8\u53ef\u4ee5\u521b\u5efa\u81ea\u5b9a\u4e49\u4e2d\u95f4\u4ef6\u7c7b\u6765\u6269\u5c55\u6216\u4fee\u6539\u65e5\u5fd7\u884c\u4e3a\uff1a\r\n```aiignore\r\n# your_app/middleware.py\r\n\r\nfrom bruce_django_requests_logger.middleware import BruceRequestsLoggerMiddleware\r\n\r\nclass CustomRequestsLogger(BruceRequestsLoggerMiddleware):\r\n    def _log_request(self, log_entry):\r\n        # \u81ea\u5b9a\u4e49\u65e5\u5fd7\u8f93\u51fa\uff0c\u4f8b\u5982\u5199\u5165\u6587\u4ef6\u6216\u53d1\u9001\u5230\u65e5\u5fd7\u670d\u52a1\r\n        custom_log = f\"CUSTOM: {log_entry['method']} {log_entry['path']} - {log_entry['duration_formatted']}\"\r\n        print(custom_log)\r\n        \r\n        # \u540c\u65f6\u4fdd\u7559\u539f\u59cb\u65e5\u5fd7\u8f93\u51fa\r\n        super()._log_request(log_entry)\r\n```\r\n\u7136\u540e\u5728 settings.py \u4e2d\u4f7f\u7528\u60a8\u7684\u81ea\u5b9a\u4e49\u7c7b\uff1a\r\n```\r\nMIDDLEWARE = [\r\n    # ...\r\n    'your_app.middleware.CustomRequestsLogger',  # \u4f7f\u7528\u81ea\u5b9a\u4e49\u4e2d\u95f4\u4ef6\r\n]\r\n```\r\n### \u6392\u9664\u7279\u5b9a\u8def\u5f84\r\n\u5982\u679c\u60a8\u5e0c\u671b\u6392\u9664\u67d0\u4e9b\u8def\u5f84\u7684\u65e5\u5fd7\u8bb0\u5f55\uff0c\u53ef\u4ee5\u521b\u5efa\u81ea\u5b9a\u4e49\u7684\u8bf7\u6c42\u68c0\u67e5\u51fd\u6570\uff1a\r\n```aiignore\r\n# your_app/utils.py\r\n\r\nfrom bruce_django_requests_logger.utils import should_log_request\r\n\r\ndef custom_should_log_request(request):\r\n    # \u6392\u9664\u5065\u5eb7\u68c0\u67e5\u8def\u5f84\u548c\u7ba1\u7406\u540e\u53f0\u9759\u6001\u6587\u4ef6\r\n    excluded_paths = ['/health/', '/admin/static/']\r\n    \r\n    for path in excluded_paths:\r\n        if request.path.startswith(path):\r\n            return False\r\n    \r\n    return should_log_request(request)\r\n```\r\n### \u751f\u4ea7\u73af\u5883\u914d\u7f6e\r\n\u5728\u751f\u4ea7\u73af\u5883\u4e2d\uff0c\u5efa\u8bae\u5c06\u65e5\u5fd7\u8f93\u51fa\u91cd\u5b9a\u5411\u5230\u6587\u4ef6\uff1a\r\n```aiignore\r\n# settings.py\r\n\r\nLOGGING = {\r\n    'version': 1,\r\n    'disable_existing_loggers': False,\r\n    'handlers': {\r\n        'file': {\r\n            'level': 'INFO',\r\n            'class': 'logging.FileHandler',\r\n            'filename': '/var/log/django/requests.log',\r\n            'formatter': 'verbose',\r\n        },\r\n    },\r\n    'formatters': {\r\n        'verbose': {\r\n            'format': '{name} {levelname} {asctime} {message}',\r\n            'style': '{',\r\n        },\r\n    },\r\n    'loggers': {\r\n        'bruce_django_requests_logger': {\r\n            'handlers': ['file'],\r\n            'level': 'INFO',\r\n            'propagate': True,\r\n        },\r\n    },\r\n}\r\n```\r\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "A Django middleware for comprehensive HTTP request logging",
    "version": "0.1.1",
    "project_urls": {
        "Homepage": "https://github.com/yourusername/bruce-django-requests-logger"
    },
    "split_keywords": [
        "django",
        " logging",
        " middleware",
        " request",
        " monitoring",
        " bruce"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "d0ae850cda5b020cc214d395273aecd89e46def3d6eb4e13d4a4fd1fe9943179",
                "md5": "9611157b3561eeebd9774c16e9d1715e",
                "sha256": "3332fcaac40b18d05cd23cbf1bb1cfd38bd6b9f828aa5d8334097db019c5deaf"
            },
            "downloads": -1,
            "filename": "bruce_django_requests_logger-0.1.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "9611157b3561eeebd9774c16e9d1715e",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 12354,
            "upload_time": "2025-11-02T06:26:24",
            "upload_time_iso_8601": "2025-11-02T06:26:24.671319Z",
            "url": "https://files.pythonhosted.org/packages/d0/ae/850cda5b020cc214d395273aecd89e46def3d6eb4e13d4a4fd1fe9943179/bruce_django_requests_logger-0.1.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "12f5c087866d3b6dc8a305f10581d4d3b333569763792665321cb871dbba0ddb",
                "md5": "9aa1db4b103411c95d7b76745a6d496f",
                "sha256": "4a3be04e6b69a6a1b75e5f3622f3df9b67935f760ed3561e53322cb2e350f245"
            },
            "downloads": -1,
            "filename": "bruce_django_requests_logger-0.1.1.tar.gz",
            "has_sig": false,
            "md5_digest": "9aa1db4b103411c95d7b76745a6d496f",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 12504,
            "upload_time": "2025-11-02T06:26:25",
            "upload_time_iso_8601": "2025-11-02T06:26:25.872952Z",
            "url": "https://files.pythonhosted.org/packages/12/f5/c087866d3b6dc8a305f10581d4d3b333569763792665321cb871dbba0ddb/bruce_django_requests_logger-0.1.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-11-02 06:26:25",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "yourusername",
    "github_project": "bruce-django-requests-logger",
    "github_not_found": true,
    "lcname": "bruce-django-requests-logger"
}
        
Elapsed time: 2.32988s