如何从Gunicorn中过滤日志?

时间:2018-09-19 14:02:34

标签: python logging gunicorn

我有一个带有gunicorn的Flask API。 Gunicorn将所有请求记录到我的API中,即

172.17.0.1 - - [19/Sep/2018:13:50:58 +0000] "GET /api/v1/myview HTTP/1.1" 200 16 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"

但是,我想过滤日志以排除某个端点,该端点在几秒钟内都从其他服务调用。

我写了一个过滤器来排除此端点:

class NoReadyFilter(logging.Filter):
    def filter(self, record):
        return record.getMessage().find('/api/v1/ready') == -1

,如果我将此过滤器添加到werkzeug记录器并使用Flask开发服务器,则该过滤器将起作用。对/api/v1/ready的请求不会出现在日志文件中。但是,我似乎无法将过滤器添加到gunicorn记录器中。使用以下代码,对/api/v1/ready的请求仍会出现:

if __name__ != '__main__':
    gunicorn_logger = logging.getLogger('gunicorn.glogging.Logger')
    gunicorn_logger.setLevel(logging.INFO)
    gunicorn_logger.addFilter(NoReadyFilter())

如何为gunicorn记录器添加过滤器?我尝试按照建议的here将其添加到gunicorn.error-logger中,但没有帮助。

2 个答案:

答案 0 :(得分:2)

我终于找到了一种创建子类的方法

class CustomGunicornLogger(glogging.Logger):

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

        # Add filters to Gunicorn logger
        logger = logging.getLogger("gunicorn.access") 
        logger.addFilter(NoReadyFilter())
guncorn.glogging.Logger继承的

。然后,您可以提供此类作为gunicorn的参数,例如

gunicorn --logger-class "myproject.CustomGunicornLogger" app

答案 1 :(得分:0)

这是一个古老的问题,但是您做的却行不通,因为您使用了错误的gunicorn记录器。访问日志不在error记录器上,而是在access记录器上(cf https://github.com/benoitc/gunicorn/blob/b2dc0364630c26cc315ee417f9c20ce05ad01211/gunicorn/glogging.py#L61

像您一样定义班级:

class NoReadyFilter(logging.Filter):
    def filter(self, record):
        return record.getMessage().find('/api/v1/ready') == -1

然后在应用程序的主要入口点:

if __name__ != "__main__":
    gunicorn_logger = logging.getLogger("gunicorn.access")
    gunicorn_logger.addFilter(NoReadyFilter())

gunicorn运行命令:gunicorn --access-logfile=- --log-file=- -b 0.0.0.0:5000 entrypoint:app