配置后没有为django设置graylog过滤器

时间:2017-09-12 18:35:04

标签: python django graylog2

我已将日志配置设置为下面的dict:

LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'formatters': {
            'simple': {
                'format': '%(levelname)s %(message)s'
            }
        },
        'filters': {
            'fields': {
                'env': 'test'
            }
        },
        'handlers': {
            'graypy': {
                'level': 'DEBUG',
                'class': 'graypy.GELFHandler',
                'host': 'graylog2.example.org',
                'port': 12201,
                'filters': ['fields']
            }
        },
        'loggers': {
            'testlogger': {
                'handlers': ['graypy'],
                'level': 'DEBUG',
                'propagate': True
            }
        }
    }

在我通过manage.py运行应用程序阶段后,我没有在graylog GUI上看到filtersenv:test弹出,所以我在本地检查了设置python manage.py shell。在控制台中,我有以下检查:

l = logging.getLogger('testlogger')
l.handlers[0].filters[0].fields

它返回AttributeError: 'Filter' object has no attribute 'fields',预计列表中应该有env:test。我已经阅读了几个如何在django中为filters设置GELFhandler的教程,看起来它们都有类似我上面设置的格式,我不知道为什么只有我没有为记录器设置过滤器。

1 个答案:

答案 0 :(得分:0)

我想出来了。出于某种原因,可以通过在字典中定义属性来直接配置handlers。但是,对于过滤器,我需要在字典配置之前添加logging.Filter的子类。

class FieldFilter(logging.Filter):
    def __init__(self, fields):
        self.fields = fields

    def filter(self, record):
        for k, v in self.fields.items():
            setattr(record, k, v)
        return True

然后我就能看到env被设置为一个过滤器。

<强>更新

这不是settings.py中的一致变化,从长远来看,你不想为你的django项目做这件事。类似的dictConfig可以轻松应用于pygelf