配置后未为 django 设置 graylog 过滤器

graylog filters is not setup for django after configuration

我已经按照下面的指令设置了一个日志记录配置:

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 申请阶段后,我没有看到 filtersenv:test 在 graylog GUI 上为我弹出,所以我检查了python manage.py shell 本地设置。在控制台中,我进行了以下检查:

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

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

我明白了。由于某些原因, 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

然后我可以看到环境被设置为一个过滤器。

更新:

settings.py 中进行的更改不是一致的,从长远来看,您不想为您的 django 项目执行此操作。类似的 dictConfig 可以很容易地应用于 pygelf.