diff --git a/config/middleware.py b/config/middleware.py new file mode 100644 index 0000000000..3243201a56 --- /dev/null +++ b/config/middleware.py @@ -0,0 +1,15 @@ +import logging +import time + + +class RequestTimeLoggingMiddleware: + def __init__(self, get_response): + self.get_response = get_response + self.logger = logging.getLogger("time_logging_middleware") + + def __call__(self, request): + request.start_time = time.time() + response = self.get_response(request) + duration = time.time() - request.start_time + self.logger.info(f"Request to {request.path} took {duration:.4f} seconds") + return response diff --git a/config/settings/base.py b/config/settings/base.py index 21627b8ab7..265abac9ab 100644 --- a/config/settings/base.py +++ b/config/settings/base.py @@ -200,6 +200,10 @@ "care.audit_log.middleware.AuditLogMiddleware", ] +# add RequestTimeLoggingMiddleware based on the environment variable +if env.bool("ENABLE_REQUEST_TIME_LOGGING", default=False): + MIDDLEWARE.insert(0, "config.middleware.RequestTimeLoggingMiddleware") + # STATIC # ------------------------------------------------------------------------------ # https://docs.djangoproject.com/en/dev/ref/settings/#static-files @@ -323,14 +327,30 @@ "verbose": { "format": "%(levelname)s %(asctime)s %(module)s " "%(process)d %(thread)d %(message)s" - } + }, + "request_time": { + "format": "INFO %(asctime)s %(message)s", + "datefmt": "%Y-%m-%d %H:%M:%S", + }, }, "handlers": { "console": { "level": "DEBUG", "class": "logging.StreamHandler", "formatter": "verbose", - } + }, + "time_logging": { + "level": "INFO", + "class": "logging.StreamHandler", + "formatter": "request_time", + }, + }, + "loggers": { + "time_logging_middleware": { + "handlers": ["time_logging"], + "level": "INFO", + "propagate": False, + }, }, "root": {"level": "INFO", "handlers": ["console"]}, }