2017-09-12 4 views
0

後のDjangoの設定ではありません:、graylogフィルタIは、以下の辞書としてログ構成を設定したコンフィギュレーション

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 

をそして、それは予想通り、リスト内のenv:testを持っている必要がありAttributeError: 'Filter' object has no attribute 'fields'を返します。私は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が1つのフィルタとして設定されていることがわかりました。

UPDATE:

それは長期的な展望のために、あなたのDjangoプロジェクトのためにこれを行うにはしたくない、settings.pyに作るための一貫した変更はありません。 でも同様のdictConfigを簡単に適用できます。

関連する問題