Как отфильтровать бревна от оружейного? - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть API Flask с gunicorn.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?Я попытался добавить его к gunicorn.error -логеру, как предлагалось здесь , но это не помогло.

1 Ответ

0 голосов
/ 22 сентября 2018

Я наконец нашел способ сделать это, создав подкласс

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
...