从 Google Cloud Run 执行日志记录的最简单方法

Zor*_*rik 10 python logging docker google-cloud-run

我按照本指南https://firebase.google.com/docs/hosting/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))
Run Code Online (Sandbox Code Playgroud)

我在 Cloud Logs Viewer 中看不到此日志。每次调用 docker 时,我都会看到 http Get 日志。我错过了什么吗?我对此很陌生,想知道假设我创建的 docker 完全按照指南中的步骤(https://firebase.google.com/docs/hosting/cloud)记录信息并查看它的简单方法是什么-运行)

谢谢

小智 9

我遇到了完全相同的问题。我确实发现刷新标准输出会导致日志出现,否则它不会出现。对我来说看起来像是 Cloud Run 中的一个错误。

print(json.dumps(entry))
import sys
sys.stdout.flush()
Run Code Online (Sandbox Code Playgroud)

带冲洗的输出

  • 更好的解决方案是在“Dockerfile”中设置“ENV PYTHONUNBUFFERED True”以完全禁用输出缓冲。 (3认同)

Onk*_*kar 8

#对于Python/Java

使用“google-cloud-logging”模块是将容器日志推送到 Stackdriver 日志的最简单方法。配置 google-cloud-logging 以使用 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}") 
Run Code Online (Sandbox Code Playgroud)

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