Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Disable logging in gunicorn for a specific request / URL / endpoint

Recently, there was the question of how to disable logging in Python Flask for a specific endpoint (Skip Flask logging for one endpoint?).

This makes sense for example for /healthcheck which you don't want to clutter your logs.

I solved this for Flask, but when running Flask using Gunicorn my solution doesn't work anymore.

How do I achieve this using Gunicorn? I want regular logging behavior, but not have any logs for the /healthcheck endpoint.

like image 330
mpaepper Avatar asked Aug 08 '19 16:08

mpaepper


2 Answers

The pre_request hook wasn't working for me. I used the answer from https://stackoverflow.com/a/52455408/2339067 to create the following gunicorn.conf.py file:

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
like image 176
b9s Avatar answered Nov 10 '22 09:11

b9s


I figured it out - you need to override the pre_request hook.

This can be done as follows:

You need to create a config file, e.g. config/gunicorn.py:

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

And then use it when you start gunicorn: gunicorn server:app -c config/gunicorn.py

like image 23
mpaepper Avatar answered Nov 10 '22 08:11

mpaepper