TL;DR バージョン: Python プロジェクトの C++ ビット内の構成可能な (そしてできればキャプチャされた) ログに何を使用しますか? 詳細は次のとおりです。
.so
エラーチェックを実行し、(部分的に) 不正確なデータをユーザーに警告する必要があるコンパイル済みモジュールがいくつかあるとします。logging
現在、Python コードのフレームワークとlog4cxx
C/C++ のライブラリを使用する、かなり単純なセットアップを行っています。log4cxx
ログ レベルはファイル ( log4cxx.properties
) で定義されており、現在は修正されており、より柔軟にする方法を考えています。私が見るいくつかの選択肢:
それを制御する 1 つの方法は、モジュール全体の構成呼び出しを行うことです。
# foo/__init__.py import sys from _foo import import bar, baz, configure_log configure_log(sys.stdout, WARNING) # tests/test_foo.py def test_foo(): # Maybe a custom context to change the logfile for # the module and restore it at the end. with CaptureLog(foo) as log: assert foo.bar() == 5 assert log.read() == "124.24 - foo - INFO - Bar returning 5"
ロギングを行うすべてのコンパイル済み関数が、オプションのログ パラメーターを受け入れるようにします。
# foo.c int bar(PyObject* x, PyObject* logfile, PyObject* loglevel) { LoggerPtr logger = default_logger("foo"); if (logfile != Py_None) logger = file_logger(logfile, loglevel); ... } # tests/test_foo.py def test_foo(): with TemporaryFile() as logfile: assert foo.bar(logfile=logfile, loglevel=DEBUG) == 5 assert logfile.read() == "124.24 - foo - INFO - Bar returning 5"
他の方法?
2番目のものはややきれいに見えますが、関数シグネチャの変更(またはkwargsを使用してそれらを解析する)が必要です。最初のものは..おそらくやや厄介ですが、モジュール全体を一度にセットアップし、個々の関数からロジックを削除します。
これについてどう思いますか?私はすべて、代替ソリューションにも耳を傾けています。
ありがとう、