配置后未为 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
申请阶段后,我没有看到 filters
、env: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
.
我已经按照下面的指令设置了一个日志记录配置:
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
申请阶段后,我没有看到 filters
、env: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
.