api/logging/__init__.py (28 lines of code) (raw):
from flask import Flask, request
from api.logging.http_info import log_request_body_and_headers, log_response_body_and_headers
VALID_LOG_LEVELS = {'debug', 'info', 'warning', 'error', 'critical'}
def parse_log_entry(_logger, entry):
"""
Parse a log entry expected from PCM frontend and logs
every single entry with the correct log level
returns
log level,
message,
extra dict (if present)
"""
level, message, extra = entry.get('level'), entry.get('message'), entry.get('extra')
lowercase_level = level.lower()
if lowercase_level not in VALID_LOG_LEVELS:
raise ValueError('Level param must be a valid log level')
return lowercase_level, message, extra
def push_log_entry(_logger, level, message, extra):
""" Logs a single log entry at the specified level """
logging_fun = getattr(_logger, level, None)
logging_fun(message, extra=extra)
class RequestResponseLogging:
def __init__(self, logger, app: Flask = None, urls_deny_list=['/logs']):
self.logger = logger
self.urls_deny_list = urls_deny_list
if app:
self.init_app(app)
def init_app(self, app):
def log_request():
if request.path not in self.urls_deny_list:
log_request_body_and_headers(self.logger, request)
def log_response(response = None):
if request.path not in self.urls_deny_list:
log_response_body_and_headers(self.logger, response)
return response
app.before_request(log_request)
app.after_request(log_response)