django - how to filter out GET static and media messages with logging?

django, logging

Solution

Recent versions of Django make it really easy to override the default logging with your own `LOGGING` settings.

To filter out all GET requests to the `/static/` directory, add the following to your `settings.py`:

def skip_static_requests(record):
    return not record.args[0].startswith('GET /static/')

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
        # use Django's built in CallbackFilter to point to your filter 
        'skip_static_requests': {
            '()': 'django.utils.log.CallbackFilter',
            'callback': skip_static_requests
        }
    },
    'formatters': {
        # django's default formatter
        'django.server': {
            '()': 'django.utils.log.ServerFormatter',
            'format': '[%(server_time)s] %(message)s',
        }
    },
    'handlers': {
        # django's default handler...
        'django.server': {
            'level': 'INFO',
            'filters': ['skip_static_requests'],  # <- ...with one change
            'class': 'logging.StreamHandler',
            'formatter': 'django.server',
        },
    },
    'loggers': {
        # django's default logger
        'django.server': {
            'handlers': ['django.server'],
            'level': 'INFO',
            'propagate': False,
        },
    }
}

Here are all of Django's default loggers as of 1.10, which you can override in the same way: https://github.com/django/django/blob/32265361279b3316f5bce8efa71f2049409461e3/django/utils/log.py#L18

Here are descriptions of what Django's default built-in loggers do: https://docs.djangoproject.com/en/1.10/topics/logging/#id3

Here's are the docs on Django's `CallbackFilter` used above to hook in the custom filter: https://docs.djangoproject.com/en/1.10/topics/logging/#django.utils.log.CallbackFilter

Problem

I'm working on a page that has lots of images so this generates lots of output in the console of this type. In my dev environment I use django to serve static and media, so I get a LOT of this in my console: ``` ... [23/May/2014 12:41:54] "GET /static/css/style.css HTTP/1.1" 304 0 [23/May/2014 12:41:55] "GET /static/js/jquery-1.7.1.min.js HTTP/1.1" 304 0 [23/May/2014 12:41:55] "GET /static/js/jquery.form.js HTTP/1.1" 304 0 ... [23/May/2014 12:41:57] "GET /media/producto/Tapa_Santiago_Vazquez_SV.jpg HTTP/1.1" 304 0 [23/May/2014 12:41:57] "GET /media/CACHE/images/producto/Barcos_y_mariposas_DVD_baja/2e3e3894ca08f88c03459e00f9018427.jpg HTTP/1.1" 304 0 [23/May/2014 12:41:56] "GET /media/CACHE/images/producto/tapaDEJA_VU/fb67e92ffd47808a263db02ca016bc24.jpg HTTP/1.1" 304 0 ... ``` making it very tedious to look for meaningful output. I would like to filter out those messages in my environment so I only see the GET for the view and my output, but so far looking at the logging I saw that I could affect other logging from django but not this. I even tried this but it didn't work: ``` LOGGING = { 'version': 1, 'disable_existing_loggers': True, 'handlers': { 'null': { 'level': 'ERROR', 'class': 'django.utils.log.NullHandler', }, }, 'loggers': { 'django': { 'handlers': ['null'], 'level': 'ERROR', 'propagate': True, }, } } ``` is it even possible to filter that kind of output out? Thanks!!

Original source