2017-09-12 164 views
0

我已經設置了日誌記錄配置如下的字典:graylog過濾器沒有設置進行配置後的Django

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 

並返回AttributeError: 'Filter' object has no attribute 'fields',這果然應在列表env:test。我已經閱讀了一些關於如何在django中爲GELFhandler設置filters的教程,好像它們都具有類似於上述設置的格式,我不知道爲什麼只有過濾器沒有設置爲我的記錄器。

回答

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被設置爲一個過濾器。

UPDATE:

它不是一個一致的變化,以使settings.py,長期的角度來看,你不想爲你的Django項目做到這一點。類似的dictConfig可以很容易地應用於pygelf