Google App Engine、Python 2.7、threadsafe:true
、webapp2 を使用。
API 応答にすべてのメッセージを含めたいlogging.XXX()
ので、要求のスコープ中に発生するすべてのログ メッセージを効率的に収集する方法が必要です。私も で操作したいthreadsafe:true
ので、正しいログ メッセージだけを取得するように注意する必要があります。
現在、私の戦略はlogging.Handler
、webapp2 ディスパッチ メソッドの先頭に a を追加し、最後に削除することです。自分のスレッドのログのみを収集するにlogging.Handler
は、現在のスレッドの名前で をインスタンス化します。ハンドラーは、別のスレッドからのログ レコードを単純に破棄します。ID を使用すると予期しない結果が得られたため、スレッド ID ではなくスレッド名をdev_appserver
使用しています。
質問:
logging.Handler
この方法でオブジェクトを常に追加/削除することは効率的ですか? つまり、すべてのリクエストは、a を追加してから削除しHandler
ます。これは「安い」ですか?リクエストのログ メッセージのみを取得するには、これが最善の方法ですか? 私の大きな仮定は、各リクエストが独自のスレッドを取得し、そのスレッド名が実際に適切なアイテムを選択することです。
Python ロギングを根本的に誤解していますか? おそらく、静的に「モジュール レベル」で 1 回追加の Handler を 1 つだけ追加する必要があり、ディスパッチで何か軽い処理を行う必要があります。
アドバイスをいただければ幸いです。ロギングに関して、Python (特に App Engine Python) が内部で何をしているのかよくわかりません。App Engine ログ ビューアがまったく同じことを行うため、これは明らかに可能です。つまり、そのリクエストのすべてのログ メッセージが表示されます。むしろ、それに便乗できれば、なおさらです。ただし、絶対に非常に安価である必要があります。つまり、RPC 呼び出しでコストが削減されるわけではありません。
それが役立つ場合は、いくつかのコードを追加できます。