4

標準の Python (2.7) ロギング ライブラリを使用するプロジェクトにモジュールを追加しようとしています。私が達成したいことは次のとおりです。

  • メインプログラム(私の制御外)がロギングを設定した場所(通常はstderr)に、WARNINGと同等またはそれより悪いものはすべて行きます
  • 他のすべて (主にデバッグ メッセージ) はログ ファイルに送信されます。

ここでの重要な問題は、グローバル ログ設定を変更したくないということです。これらはメイン アプリによって制御されているためです。それ以外の場合は、次の例を使用します。

http://docs.python.org/2/howto/logging-cookbook.html#logging-to-multiple-destinations

私はこれを試しました:

logger = logging.getLogger('my_module')
logger.setLevel(logging.WARNING)
fh = logging.FileHandler('my_module.log')
fh.setLevel(logging.DEBUG)
logger.addHandler(fh)

しかし、その後、ファイルに警告メッセージしか表示されません。

上記の行を次のように置き換えると:

logger.setLevel(logging.DEBUG)

その後、stderr と自分のファイルの両方にデバッグ メッセージが表示されます。

それから私はこれを試しました:

logger = logging.getLogger('my_module')
logger.setLevel(logging.DEBUG)
logger.addHandler(logging.NullHandler())
console = logging.StreamHandler()
console.setLevel(logging.WARNING)
logger.addHandler(console)
fh = logging.FileHandler('my_module.log')
fh.setLevel(logging.DEBUG)
logger.addHandler(fh)

しかし、再び運がありません。

では、basicConfig() など、グローバル ロギング インフラストラクチャに影響を与えるものを呼び出さなくても、これを実現できますか? 可能であれば、ここで自分のモジュールを変更したいだけです。

ありがとう!

4

2 に答える 2

2
  • メインプログラム(私の制御外)がロギングを設定した場所(通常はstderr)に、WARNINGと同等またはそれより悪いものはすべて行きます
  • 他のすべて (主にデバッグ メッセージ) はログ ファイルに移動します。

祖先のハンドラーに WARNING レベルを設定しないと、単一のロガーでは実行できません。ドキュメントから:

Logger.propagate

これが true と評価された場合、ロギング メッセージは、このロガーとその子ロガーによって、より高いレベル (祖先) ロガーのハンドラーに渡されます。メッセージは祖先ロガーのハンドラーに直接渡されます - 問題の祖先ロガーのレベルもフィルターも考慮されません。


この状況でモジュールができることを提案しますか?

一般に、ロガーの WARNING レベルの設定と の追加を除いてNullHandler()、ライブラリ コードはロギングをまったく構成すべきではありません。

メイン アプリケーションがデバッグ情報を提供する簡単な方法が必要な場合は、ライブラリの DEBUG レベルのログ記録を構成する関数を定義します。


すべてを表示したいファイルを除いて、ライブラリを DEBUG にしたくありません。

メイン プログラムを制御できない場合は、明示的に要求されない限り、 your_module を使用することの副作用としてデバッグ ファイルを作成しないでください。

import your_module # in the main application

your_module.get_logger().log_to_file(filename) # without this line your module
                                               # shouldn't create debug files
...
your_module.some_function()

このロガー階層がどのように機能するかわかりません。作成したロガーは、アプリが構成したルート ロガーの子ですか?

''ルートロガーです。logger'a.b'の子です。'a'

于 2013-01-16T17:22:47.490 に答える
0

同じファイルを指す 2 つのロガーを作成してみてください。1 つの .ERROR と 1 つの .WARNING。Python でこれを行ったことはありませんが、なぜ機能しないのかわかりません。書き込み後にストリームをフラッシュする限り、コルーチンを実行していない限り、互いに干渉することはありません。その場合、いくつかのロックなどでプログラムする必要があります。プログラムが線形に実行される限り、心配する必要はありません。

于 2013-01-16T16:40:28.513 に答える