从Google云运行执行日志记录的最简单方法

2024-05-13 21:15:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我按照这个指南https://firebase.google.com/docs/hosting/cloud-run来设置cloud run docker。 然后我尝试按照这个指南执行一个简单的日志。正在尝试将结构化日志写入标准输出 这是我的代码:

    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时都会看到HTTPGET日志。 我遗漏了什么吗?我是新手,想知道如果我创建的docker完全按照指南中的步骤(https://firebase.google.com/docs/hosting/cloud-run)创建,那么记录信息和查看信息的简单方法是什么

谢谢


Tags: dockerrunhttpscomlogclouddocsgoogle
3条回答

#对于Python/Java

使用“GoogleCloudLogging”模块是将容器日志推送到Stackdriver日志的最简单方法。配置GoogleCloud日志记录以使用python的默认日志记录模块

import logging as log
import google.cloud.logging as logging

def doSomething(param):
    logging_client = logging.Client()
    logging_client.setup_logging()
log.info(f"Some log here: {param}") 

现在您应该在Cloud Run Revision下的Stackdriver日志中看到此日志

我遇到了完全相同的问题。我确实发现,刷新stdout会导致日志出现,否则它不会出现。看起来像是云中的一只虫子

print(json.dumps(entry))
import sys
sys.stdout.flush()

Output with flushing

将Google云平台日志集成到Python代码中的一个简单方法是从logging.StreamHandler创建一个子类。通过这种方式,日志记录级别也将与谷歌云日志记录级别相匹配,使您能够根据严重性进行过滤。此解决方案也适用于云运行容器

您还可以将此处理程序添加到任何现有记录器配置中,而无需更改当前日志代码

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

相关问题 更多 >