Tengo una aplicación Python Flask. Hay una comprobación de estado que afecta mucho a un punto final (/), y me gustaría no verla en los registros. ¿Cómo deshabilito el registro solo para un punto final GET y lo dejo para todo lo demás?
Le sugiero que implemente un filtro de registro dedicado. Enchufe ese filtro en el registrador werkzeug interno.
También puede investigar la subclasificación del método log_request del controlador de solicitudes WSGI en https://github.com/pallets/werkzeug/blob/71cf9902012338f8ee98338fa7bba50572606637/src/werkzeug/serving.py#L378
Étienne Bersac me indicó la dirección correcta.
Así es como lo implementé:
from werkzeug import serving parent_log_request = serving.WSGIRequestHandler.log_request def log_request(self, *args, **kwargs): if self.path == '/healthcheck': return parent_log_request(self, *args, **kwargs) def filter_healthcheck_logs(): serving.WSGIRequestHandler.log_request = log_requestOtra opción es mono parche WSGIRequestHandler sugerido por Étienne Bersac
Por aquí:
from werkzeug.serving import WSGIRequestHandler from werkzeug.urls import uri_to_iri try: import click except ImportError: click = None def log_request(WSGIRequestHandler, code="-", size="-"): try: path = uri_to_iri(WSGIRequestHandler.path) if path in black_listed_routes: return msg = "%s %s %s" % (WSGIRequestHandler.command, path, WSGIRequestHandler.request_version) except AttributeError: # path isn't set if the requestline was bad msg = WSGIRequestHandler.requestline code = str(code) if click: color = click.style if code[0] == "1": # 1xx - Informational msg = color(msg, bold=True) elif code[0] == "2": # 2xx - Success msg = color(msg, fg="white") elif code == "304": # 304 - Resource Not Modified msg = color(msg, fg="cyan") elif code[0] == "3": # 3xx - Redirection msg = color(msg, fg="green") elif code == "404": # 404 - Resource Not Found msg = color(msg, fg="yellow") elif code[0] == "4": # 4xx - Client Error msg = color(msg, fg="red", bold=True) else: # 5xx, or any other response msg = color(msg, fg="magenta", bold=True) WSGIRequestHandler.log("info", '"%s" %s %s', msg, code, size) def monkey_patch_logger(): WSGIRequestHandler.log_request = log_requestEsta es una implementación ligeramente modificada basada en la respuesta de mpaepper .
Permite especificar los puntos finales de registro deshabilitados usando expresiones regulares. Esto puede ser útil cuando desea ignorar los registros de puntos finales como "/v1/recipes/<int:recipe_id>" :
def disable_endpoint_logs(): """Disable logs for requests to specific endpoints.""" disabled_endpoints = ('/', '/healthz', '/v1/recipes/[0-9]+') parent_log_request = serving.WSGIRequestHandler.log_request def log_request(self, *args, **kwargs): if not any(re.match(f"{de}$", self.path) for de in disabled_endpoints): parent_log_request(self, *args, **kwargs) serving.WSGIRequestHandler.log_request = log_request Con el código anterior, los registros del extremo "/v1/recipes/23992341" se ignorarían, pero los de "/v1/recipes" no se ignorarían.
Simplemente llame a esta función una vez en su código y estará listo para comenzar.
Las otras soluciones presentadas son correctas y funcionan para Werkzeug en una configuración predeterminada de Flask. El mismo enfoque también funciona cuando se usa Flask con gevent, pero decidió publicarlo aquí en caso de que alguien más lo encuentre y necesite el código de inmediato:
from gevent.pywsgi import WSGIHandler class CustomWSGIHandler(WSGIHandler): def log_request(self): requests_to_ignore = ["/health", "/"] if self.path in requests_to_ignore: return super(CustomWSGIHandler, self).log_request()