2016-09-07 4 views
1

Pythonのネイティブロギング機能を使用するときに、DEBUGおよびINFOレベルのメッセージが表示される方法を変更したいと考えています。 「変更」とは、フォーマットを変更するのではなく、余分な論理レベルを追加することです。例:Pythonロギング機能の動作を変更するには?

# This is a global variable that is set at the time of initializing the logging. 
required_verbosity_level = 7 

# This variable is passed with each call to the logger. 
supplied_verbosity_level = 5 

したがって、ロガーを作成する際には、グローバル要件が満たされます。

logger = LoggerBridge(required_verbosity_level = 7) 

我々はメソッドを呼び出すときに、我々は適切なレベルに合格:

logger.debug('This is a debug message.', supplied_verbosity_level = 5) 

だから内部、ロジックは次のようになり(5 < 7)、これはメッセージ可視に起因するであろうsuppliedの値がrequiredと一致しています。ただし、以下の場合:

logger.debug('This is a debug message.', supplied_verbosity_level = 11) 

メッセージsupplied値がrequired値よりも高いとして見えるようになることはありません。問題は、このような行動を実現するための最良の場所はどこですか?

は今、私は、現在のLoggerクラスを継承し、内部動作をオーバーライドに基づいてmixinアプローチとして知られている何か物事のカップルを試してみました:理論的には

class LoggerBridge(object): 
    def __init__(self, required_verbosity_level): 
     self.required_verbosity_level = required_verbosity_level 

    def _log_bridge(self, logger): 
     logger(message) 

    def info(self, message, supplied_verbosity_level): 
     if supplied_verbosity_level < self.required_verbosity_level: 
      self._log_bridge(logging.info, message) 

    def debug(self, message, supplied_verbosity_level): 
     if supplied_verbosity_level < self.required_verbosity_level: 
      self._log_bridge(logging.debug, message) 

を、これが動作しているようです。しかし、それは正しい方法ですか? custom handlercustom filterのようなビルトインロギングビットのいずれかを使用してこれを解決する方法はありますか?

答えて

1

カスタムデバッグレベルが必要な場合は、そのままをサポートしています。 setLevel()を使用してロガーでカスタムデバッグレベル(例ではrequired_verbosity_level)を設定し、ロギングにlog()メソッドを使用し、カスタムレベル(例ではsupplied_verbosity_level)を渡します。 このロジックをさらにカスタマイズするには、isEnabledFor()メソッドをオーバーライドします。

+0

私はレベルを混乱させることに少し消極的です。レベルを明示的に定義する必要があるので、互換性などの面で手間がかかります。たぶん 'logging.disable'をどうにか利用できますか? – symbolix

+0

@symbolixレベルを明示的に定義する必要がある*とはどういう意味ですか?レベルは任意の整数にすることができ、レベルを前面に定義する必要はありません。 'info(...)'は 'log(20、...)'を呼び出すのと同じで、 'log(、...)'も呼び出すことができます。 'addLevelName()'を使ってレベル名をある整数で束縛することはオプションです。 'logging.disable()'はモジュールレベルの関数であり、すべてのロガーに作用しますが、あなたの例では特定のロガーのレベルを設定します。また、私はあなたの例のレベルが後方にあると思います、より高いレベルはより重要な意味を持つはずです。 –

+0

ありがとう、私はこの解決策を検討します。私は、学習の目的のために、これをLoggerクラスとして設定する解決策を検討するかもしれないと思います。 – symbolix

関連する問題