4

ログが複数のプロセスによって生成される場合、ログを収集して google cloud logging に送信するための推奨される方法はどれですか?

これが私の CloudLoggingHandler ベースの提案です。批判してもよろしいですか?

import google
from multiprocessing import Process
from logging import getLogger

class Worker(Process):
    def __init__(self):
        super(Worker, self).__init__()

    def __setup_logger(self):
        handler = CloudLoggingHandler(google.cloud.logging.Client(), name='log-name')                           
        logger = logging.getLogger()
        logger.setLevel(logging.DEBUG)
        google.cloud.logging.handlers.setup_logging(handler)

    def run(self):
        self.__setup_logger()
        for i in range(10):
            logging.warning("i=%d", i)

if __name__ == "__main__":
    for _ in range(2):
        w = Worker()
        w.start()

ここでキュー ベースのログ ハンドラーについて読みましたが、CloudLoggingHandler は分離されたスレッドでバッチ コミットを使用するため、キュー ベースのハンドラーはやり過ぎです。私は正しいですか?

Sourcesは、CloudLoggingHandler がスレッド セーフであることを示しているため、CloudLoggingHandler の 1 つのインスタンスをすべてのプロセスで共有するだけで十分な場合があります。それはうまくいくでしょうか?もしそうなら、それは厳しすぎませんか?


@thomas-schultz に回答するために以下を編集します。

私は自分の提案に固執しました。主な理由は、私がプロトタイピングを行っていたためで、「箱から出してすぐに」動作し、パフォーマンスの問題をチェックしなかったからです。私はこの選択を再考しています。

実際、私が理解していることから、BackgroundThreadTransportを使用したCloudLoggingHandlerは、ログがログ エンドポイントに送信されるまでメイン スレッドをブロックします。これは、ほぼ各ログ行で発生します。実際、ログ レコードが 1 つになるとすぐにバッチが送信されます (ソース参照)。

私の開発環境では、複数のプロセスが同時にログを記録すると、1 つのプロセスがログが送信されるまで最大 1 秒待機することが発生します。これは主にネットワーク コストであり、Google のデータ センター内からは「それほど多くない」程度に縮小されると思います。

すべてのログ レコードをQueueにプッシュするStreamHandlerを定義することを検討しています。このキューは、ログをロギング エンドポイントに送信する役割を担うプロセスによって読み取られます。関連する場合、このプロセスは CloudLoggingHandler に依存してそれを行うことがあります。

これは理にかなっていますか?

4

2 に答える 2