web-dev-qa-db-ja.com

Google Cloud Runからのロギングを実行する最も簡単な方法

私はこのガイドに続きます https://firebase.google.com/docs/hosting/cloud-run Cloud Run Dockerを設定します。それから私はこのガイドに従うことを試みました https://cloud.google.com/run/docs/logging 単純なログを実行します。 stdoutに構造化されたログを書き込もうとしているこれは私のコードです:

    trace_header = request.headers.get('X-Cloud-Trace-Context')

    if trace_header:
        trace = trace_header.split('/')
        global_log_fields['logging.googleapis.com/trace'] = "projects/sp-64d90/traces/" + trace[0]

    # Complete a structured log entry.
    entry = dict(severity='NOTICE',
                 message='This is the default display field.',
                 # Log viewer accesses 'component' as jsonPayload.component'.
                 component='arbitrary-property',
                 **global_log_fields)

    print(json.dumps(entry))
 _

クラウドログビューアにこのログを表示できません。 Dockerを呼び出すたびに、HTTP GETログが表示されます。何も見逃していますか?私はこれに新しくて、私が作成したドッカーがガイドからの手順と完全であると仮定して、情報を記録し、それを見ることができるようなシミュレーションの方法は何ですか( https://firebase.google.com/docs) /ホスティング/クラウドラン

ありがとう

9
Zorik

Google Cloud LogggingのBunyanおよびWinston Node.jsライブラリのサポートがあります。

通常、DOを見ていない場合構造化ロギング、あなたがする必要があるのはstdout/stderrに印刷することだけで、クラウドランはそれを拾い上げます。

これは、 https://cloud.google.com/run/docs/logging 、構造化および非構造化ロギングのためのnode.jsの例を持っています。

0
AhmetB - Google

Google Cloud Platformのログ記録をPythonコードに統合する簡単な方法は、logging.StreamHandlerからサブクラスを作成することです。このようにして、ロギングレベルもGoogle Cloud Loggingのものと一致し、重大度に基づいてフィルタリングすることができます。このソリューションは、クラウドランコンテナ内でも機能します。

また、現在のロギングコードを変更する必要なく、このハンドラを既存のロガー構成に追加するだけです。

import json
import logging
import os
import sys
from logging import StreamHandler

from flask import request


class GoogleCloudHandler(StreamHandler):
    def __init__(self):
        StreamHandler.__init__(self)

    def emit(self, record):
        msg = self.format(record)
        # Get project_id from Cloud Run environment
        project = os.environ.get('GOOGLE_CLOUD_PROJECT')

        # Build structured log messages as an object.
        global_log_fields = {}
        trace_header = request.headers.get('X-Cloud-Trace-Context')

        if trace_header and project:
            trace = trace_header.split('/')
            global_log_fields['logging.googleapis.com/trace'] = (
                f"projects/{project}/traces/{trace[0]}")

        # Complete a structured log entry.
        entry = dict(severity=record.levelname, message=msg)
        print(json.dumps(entry))
        sys.stdout.flush()

ハンドラを設定して使用する方法は次のとおりです。

def get_logger():
    logger = logging.getLogger(__name__)

    if not logger.handlers:
        gcp_handler = GoogleCloudHandler()
        gcp_handler.setLevel(logging.DEBUG)

        gcp_formatter = logging.Formatter(
            '%(levelname)s %(asctime)s [%(filename)s:%(funcName)s:%(lineno)d] %(message)s')
        gcp_handler.setFormatter(gcp_formatter)
        logger.addHandler(gcp_handler)
    return logger
0
DfreakD