Skip to main content

Framework-agnostic HTTP logger with payload masking

Project description

blackbox_logger

PyPI License

A framework-agnostic HTTP logger for Python apps. Logs requests and responses while masking sensitive data like passwords and tokens.

Features

  • Request/response logging
  • Payload masking (e.g. passwords, secrets)
  • Works with any Python HTTP framework (Flask, Django, FastAPI, WSGI)

Install

pip install git+https://github.com/yourusername/blackbox_logger.git

📘 Usage Examples for Each Framework

🔹 Flask

from flask import Flask, request, g
from blackbox_logger import HTTPLogger

app = Flask(__name__)
logger = HTTPLogger(get_user=lambda headers: headers.get("X-User", "Anonymous"))

@app.before_request
def before():
    g.request_body = request.get_data()
    logger.log_request(
        method=request.method,
        path=request.path,
        headers=request.headers,
        body=g.request_body,
        request=request,
    )

@app.after_request
def after(response):
    logger.log_response(
        method=request.method,
        path=request.path,
        headers=request.headers,
        response_body=response.get_data(),
        status_code=response.status_code,
        request=request,
    )
    return response

🔹 Django

from django.utils.deprecation import MiddlewareMixin
from blackbox_logger import HTTPLogger

logger = HTTPLogger(get_user=lambda request: request.user.username if request.user.is_authenticated else "Anonymous")

class BlackboxLoggerMiddleware(MiddlewareMixin):
    def process_request(self, request):
        request._body_payload = request.body
        logger.log_request(
            method=request.method,
            path=request.get_full_path(),
            headers=request.headers,
            body=request.body,
            request=request,
        )

    def process_response(self, request, response):
        logger.log_response(
            method=request.method,
            path=request.get_full_path(),
            headers=request.headers,
            response_body=response.content,
            status_code=response.status_code,
            request=request,
        )
        return response

🔹 FastAPI

from fastapi import FastAPI, Request
from blackbox_logger import HTTPLogger

app = FastAPI()
logger = HTTPLogger(get_user=lambda headers: headers.get("X-User", "Anonymous"))

@app.middleware("http")
async def log_requests(request: Request, call_next):
    body = await request.body()
    logger.log_request(
        method=request.method,
        path=request.url.path,
        headers=request.headers,
        body=body,
        request=request,
    )
    response = await call_next(request)
    logger.log_response(
        method=request.method,
        path=request.url.path,
        headers=request.headers,
        response_body=response.body,
        status_code=response.status_code,
        request=request,
    )
    return response

🔹 WSGI (e.g., Gunicorn)

For WSGI applications, you can use the WSGIRequestLogger middleware:

from blackbox_logger import HTTPLogger

class WSGIRequestLogger:
    def __init__(self, app, get_user=None, get_client_ip=None):
        self.app = app
        self.logger = HTTPLogger(get_user=get_user, get_client_ip=get_client_ip)

    def __call__(self, environ, start_response):
        method = environ.get('REQUEST_METHOD')
        path = environ.get('PATH_INFO')
        headers = {key: value for key, value in environ.items() if key.startswith('HTTP_')}
        body = environ.get('wsgi.input').read()
        client_ip = environ.get('REMOTE_ADDR')

        self.logger.log_request(
            method=method,
            path=path,
            headers=headers,
            body=body,
            request=environ,
        )

        def custom_start_response(status, response_headers, exc_info=None):
            self.logger.log_response(
                method=method,
                path=path,
                headers=headers,
                response_body=status,
                status_code=status.split()[0],
                request=environ,
            )
            return start_response(status, response_headers, exc_info)

        return self.app(environ, custom_start_response)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

blackbox_logger-0.1.1.tar.gz (4.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

blackbox_logger-0.1.1-py3-none-any.whl (5.2 kB view details)

Uploaded Python 3

File details

Details for the file blackbox_logger-0.1.1.tar.gz.

File metadata

  • Download URL: blackbox_logger-0.1.1.tar.gz
  • Upload date:
  • Size: 4.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.11.5

File hashes

Hashes for blackbox_logger-0.1.1.tar.gz
Algorithm Hash digest
SHA256 70e4cc4e19a1b9e676d4da6d1c2e22845353c01728cede4bdc204c49ff47c0bd
MD5 31ec7d6887274bbf5e671ee5b54d4bf1
BLAKE2b-256 2e1800707a4759761920f8ca1a38fe3f640ce0d867a476a875651676bb019140

See more details on using hashes here.

File details

Details for the file blackbox_logger-0.1.1-py3-none-any.whl.

File metadata

File hashes

Hashes for blackbox_logger-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 82c25fde45175b907b1e471577128d2a072a8efafa4811aa0953e4d75784153c
MD5 d728abe1d0e0163f2044abf6efdccfd2
BLAKE2b-256 d599013edf11025bfe9303491be8453e84f8647c9f961250977d6130fc5a9e86

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page