patternpythonModeratepending
Pattern: Request/Response logging middleware
Viewed 0 times
middlewareloggingrequest-iddurationtracingAPI
Problem
Need to log all API requests and responses for debugging without cluttering business logic with logging code.
Solution
Implement logging as middleware:
import time, uuid, logging
logger = logging.getLogger('api')
# Express.js middleware:
def logging_middleware(app):
@app.before_request
def log_request():
request.id = str(uuid.uuid4())[:8]
request.start_time = time.time()
logger.info('Request', extra={
'request_id': request.id,
'method': request.method,
'path': request.path,
'query': dict(request.args),
'ip': request.remote_addr,
})
@app.after_request
def log_response(response):
duration = (time.time() - request.start_time) * 1000
logger.info('Response', extra={
'request_id': request.id,
'status': response.status_code,
'duration_ms': round(duration, 2),
'size': response.content_length,
})
response.headers['X-Request-ID'] = request.id
return response
# What to log:
# - Request: method, path, query params, user agent, IP
# - Response: status code, duration, response size
# - DO NOT log: request bodies (may contain PII), auth tokens
# Slow request alerting:
if duration > 5000: # 5 seconds
logger.warning('Slow request', extra={
'request_id': request.id,
'duration_ms': duration,
'path': request.path,
})
import time, uuid, logging
logger = logging.getLogger('api')
# Express.js middleware:
def logging_middleware(app):
@app.before_request
def log_request():
request.id = str(uuid.uuid4())[:8]
request.start_time = time.time()
logger.info('Request', extra={
'request_id': request.id,
'method': request.method,
'path': request.path,
'query': dict(request.args),
'ip': request.remote_addr,
})
@app.after_request
def log_response(response):
duration = (time.time() - request.start_time) * 1000
logger.info('Response', extra={
'request_id': request.id,
'status': response.status_code,
'duration_ms': round(duration, 2),
'size': response.content_length,
})
response.headers['X-Request-ID'] = request.id
return response
# What to log:
# - Request: method, path, query params, user agent, IP
# - Response: status code, duration, response size
# - DO NOT log: request bodies (may contain PII), auth tokens
# Slow request alerting:
if duration > 5000: # 5 seconds
logger.warning('Slow request', extra={
'request_id': request.id,
'duration_ms': duration,
'path': request.path,
})
Why
Middleware logging captures every request without polluting business logic. The request ID enables tracing across logs.
Revisions (0)
No revisions yet.