2011-09-11 7 views
3

Twistedベースのクライアントは、ループ内でUDPパケットを送信します。 したがって、DatagramProtocolクラスを使用しています。Twisted:Twisted-frameworkクラスのログを無効にする

#!/usr/bin/python 
# -*- coding: utf-8 -*- 
from twisted.application.service import Service 
from twisted.internet import reactor 
from twisted.internet.task import LoopingCall 
from twisted.internet.protocol import DatagramProtocol 
from twisted.python import log 
import logging 

class HeartbeatClient(Service): 
    def __init__(self, host, port, data, beat_period): 
     self.ip = host 
     self.port = int(port) 
     self.data = data 
     self.beat = int(beat_period) 

    def startService(self): 
     self._call = LoopingCall(self._heartbeat) 
     self._call.start(self.beat) 

    def stopService(self): 
     self._call.stop() 

    def _heartbeat(self): 
     protocol = DatagramProtocol() 
     protocol.noisy = False 
     port = reactor.listenUDP(0, protocol) 
     port.write(self.data, (self.ip, self.port)) 
     port.stopListening() 

私はtwistdでこのクライアントを実行すると、私は永久に、すなわちクラスDatagramProtocolから、ツイストのクラスからログメッセージを取得する:これらのログメッセージがあるので

2011-09-11 18:39:25+0200 [-] (Port 55681 Closed) 
2011-09-11 18:39:30+0200 [-] twisted.internet.protocol.DatagramProtocol starting on 44903 
2011-09-11 18:39:30+0200 [-] (Port 44903 Closed) 
2011-09-11 18:39:35+0200 [-] twisted.internet.protocol.DatagramProtocol starting on 50044 
2011-09-11 18:39:35+0200 [-] (Port 50044 Closed) 
2011-09-11 18:39:40+0200 [-] twisted.internet.protocol.DatagramProtocol starting on 37450 

これはソースです自分自身のログを汚染すると、これらのログメッセージを無効にすることができるのだろうかと思います。 私は既にprotocol.noisy = Falseを呼び出してログの量を減らしましたが、まだ他のログメッセージを取得しています。また、コマンドg = protocol.ClientFactory().noisy = Falseは役に立ちません。

すべてのツイスト内部クラスのロギングを一般的な方法で無効にすることはできますか?おそらく、Twisted-loggingの設定を使用していますか?

+0

関連:http://stackoverflow.com/q/5078980 – jfs

+0

ありがとう。残念ながら、答えはこの問題に対する解決策ではありません。私がプロトコル上のノイズをfalseに設定しても(私の質問に加えて)、私はまだログメッセージを取得します。 – ifischer

+2

ログメッセージは 'twisted.internet.udp.Port'クラスからです。[' ._bindSocket() '](http://twistedmatrix.com/trac/browser/trunk/twisted/internet/udp.py#L99)を参照してください。 )と['.connectionLost()'](http://twistedmatrix.com/trac/browser/trunk/twisted/internet/udp.py#L218)メソッドを使用します。無効にするオプションはありません。 http://twistedmatrix.com/documents/current/core/howto/application.html#auto6 – jfs

答えて

5

ツイストのログはすべて非常に素朴です。しかし、twisted.python.logは非常に特徴的で、あなた(そして他の人)が興味を持っているような選択的な報告をすることができるので、これが必要な理由はありません。

ログイベントはちょうど任意の辞書ですキーと値。既定のオブザーバーは、'message'キーを持つ辞書について認識しています。おそらくこのため、Twisted自身が発行したほとんどのログメッセージは、この鍵に関連付けられた人間が読める文字列を提供する以外は何もしません(また、多くのメッセージはより前に追加されました。 Twisted Logging System、消費者としてより古くより原始的なシステムを持っていた)。

あまりにもずっと前に、この問題は、a ticketを提出し、特にthe UDP part of the problemの解決に取り掛かるように促された人に迷惑をかけました。問題はほとんど解決されていますが、いくつかのことが残っています。

解決策は、同じ情報を伝達する構造化されたメッセージを記録することですが、メッセージを持たず、デフォルトのオブザーバーによって記録されません。これにより、デフォルトでログに表示されるメッセージは回避されますが、これらのイベントに特に関心を持っているオブザーバが監視し、必要に応じて処理することができます。

チケットはしばらく前から座っていました。誰かがパッチを拾い上げて、それを補完する方法の最後のビットにするのはおそらく簡単でしょう。

関連する問題