2

Google App Engine、Python 2.7、threadsafe:true、webapp2 を使用。

API 応答にすべてのメッセージを含めたいlogging.XXX()ので、要求のスコープ中に発生するすべてのログ メッセージを効率的に収集する方法が必要です。私も で操作したいthreadsafe:trueので、正しいログ メッセージだけを取得するように注意する必要があります。

現在、私の戦略はlogging.Handler、webapp2 ディスパッチ メソッドの先頭に a を追加し、最後に削除することです。自分のスレッドのログのみを収集するにlogging.Handlerは、現在のスレッドの名前で をインスタンス化します。ハンドラーは、別のスレッドからのログ レコードを単純に破棄します。ID を使用すると予期しない結果が得られたため、スレッド ID ではなくスレッド名をdev_appserver使用しています。

質問:

  1. logging.Handlerこの方法でオブジェクトを常に追加/削除することは効率的ですか? つまり、すべてのリクエストは、a を追加してから削除しHandlerます。これは「安い」ですか?

  2. リクエストのログ メッセージのみを取得するには、これが最善の方法ですか? 私の大きな仮定は、各リクエストが独自のスレッドを取得し、そのスレッド名が実際に適切なアイテムを選択することです。

  3. Python ロギングを根本的に誤解していますか? おそらく、静的に「モジュール レベル」で 1 回追加の Handler を 1 つだけ追加する必要があり、ディスパッチで何か軽い処理を行う必要があります。

アドバイスをいただければ幸いです。ロギングに関して、Python (特に App Engine Python) が内部で何をしているのかよくわかりません。App Engine ログ ビューアがまったく同じことを行うため、これは明らかに可能です。つまり、そのリクエストのすべてのログ メッセージが表示されます。むしろ、それに便乗できれば、なおさらです。ただし、絶対に非常に安価である必要があります。つまり、RPC 呼び出しでコストが削減されるわけではありません。

それが役立つ場合は、いくつかのコードを追加できます。

4

1 に答える 1

1

私はここでたくさんの良さを見つけました:

from google.appengine.api import logservice
entries = logservice.logs_buffer().parse_logs()
于 2012-06-26T14:40:09.280 に答える