我已将日志配置设置为下面的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上看到filters
,env: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
的教程,看起来它们都有类似我上面设置的格式,我不知道为什么只有我没有为记录器设置过滤器。
答案 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
。