为特定请求/URL/端点禁用登录 gunicorn

Posted

技术标签:

【中文标题】为特定请求/URL/端点禁用登录 gunicorn【英文标题】:Disable logging in gunicorn for a specific request / URL / endpoint 【发布时间】:2019-12-16 09:41:37 【问题描述】:

最近,有一个问题是如何在 Python Flask 中为特定端点 (Skip Flask logging for one endpoint?) 禁用日志记录。

这对于例如 /healthcheck 是有意义的,您不想让日志混乱。

我为 Flask 解决了这个问题,但是当使用 Gunicorn 运行 Flask 时,我的解决方案不再起作用。

如何使用 Gunicorn 实现这一目标?我想要常规的日志记录行为,但没有 /healthcheck 端点的任何日志。

【问题讨论】:

【参考方案1】:

pre_request 钩子对我不起作用。我使用来自https://***.com/a/52455408/2339067 的答案创建了以下gunicorn.conf.py 文件:

import logging
from gunicorn import glogging


class CustomGunicornLogger(glogging.Logger):

    def setup(self, cfg):
        super().setup(cfg)

        # Add filters to Gunicorn logger
        logger = logging.getLogger("gunicorn.access")
        logger.addFilter(HealthCheckFilter())

class HealthCheckFilter(logging.Filter):
    def filter(self, record):
        return 'GET /healthcheck' not in record.getMessage()

accesslog = '-'
logger_class = CustomGunicornLogger

【讨论】:

检查 '/healthceck' 是否不在 record.args 中也有效。 过滤永远不应该在record.getMessage()上进行。这意味着通过适当地设置他们的用户代理,攻击者可以避免他们的请求被记录。另外,创建将被丢弃的消息是不必要的工作。【参考方案2】:

我想通了 - 你需要覆盖 pre_request 钩子。

这可以按如下方式完成:

您需要创建一个配置文件,例如config/gunicorn.py:

def pre_request(worker, req):
    if req.path == '/healthcheck':
        return
    worker.log.debug("%s %s" % (req.method, req.path))

然后在启动 gunicorn 时使用它: gunicorn server:app -c config/gunicorn.py

【讨论】:

该解决方案有效,但这是否已记录在案,您能否指出指定此方法的文档? docs.gunicorn.org/en/stable/settings.html#server-hooks

以上是关于为特定请求/URL/端点禁用登录 gunicorn的主要内容,如果未能解决你的问题,请参考以下文章

如何禁用特定端点的身份验证?

覆盖金字塔/ gunicorn中的请求超时

Nuxt Auth 中间件向用户端点发出空请求

Spring Boot:为执行器端点禁用 https

忽略 Spring Boot 中特定 Url 的承载令牌验证

禁用特定时间段的通知