2011-06-27 7 views
1

私はフレーズ!Silentを使用して、ログレコードが保存される場所を決定します。
ログレコードメッセージに文字列の先頭に!Silentが含まれていると、私のFilterサブクラスはこのメッセージをStreamHandlerで拒否します。しかし、メッセージはFileHandlerMemoryHandlerのように他のハンドラに渡され、!Silentというフレーズで渡されます。Pythonロギング - フォーマッタをグローバルに適用する

文字列の先頭に白い文字を含むこのフレーズを削除するために単純なFormatterサブクラスを作成しましたが、このフォーマッタをハンドラに適用する際に問題があります。

私のアプリケーションの多くの場所で、ルートロガーハンドラを作成、追加、削除します。これらのハンドラのそれぞれは私のFormatterサブクラスを持っているはずですが、それぞれのハンドラに手動で追加するのは少し不快です。

Formatterクラスをルートロガーにグローバルに適用する方法や、root loggerに追加する前にルートログャーaddHandlerのメソッドを上書きしてハンドラーに追加する方法を探しています。存在する場合、またはより単純な方法。

答えて

1

正直なところ、私はあなたの質問を完全に理解しているとは思えないので、私の答えがあなたのlookngではない場合は私を許してください...しかし、すべてのハンドラの入力にフィルタを適用する代わりに、渡しているユニコード(または文字列)オブジェクトに渡します。ような何か:

>>> class LogMsg(unicode): 
...  def __new__(cls, string_): 
...   if string_[:7] == '!Silent': 
...    cls.nolog = True 
...    return super(LogMsg, cls).__new__(cls, string_[7:]) 
...   else: 
...    cls.nolog = False 
...    return super(LogMsg, cls).__new__(cls, string_) 
... 
>>> a = LogMsg('The hard drive is on fire!') 
>>> a 
u'The hard drive is on fire!' 
>>> a.nolog 
False 
>>> b = LogMsg('!SilentMy feet stink! :(') 
>>> b 
u'My feet stink! :(' 
>>> b.nolog 
True 

あなたは、単にあなただけがする必要がある場合にテストすることができ!Silentを表示していないが、隠しフラグ(nolog)が決して「文字列」を周りに渡すことができるこの方法です。

HTH、 /mac

関連する問題