【问题标题】:Google cloud functions missing logs issue谷歌云功能缺少日志问题
【发布时间】:2020-05-16 15:20:23
【问题描述】:

我有一个与 PubSub 主题相关的小型 python CF,它应该使用 sendgrid API 发送一些电子邮件。

CF 可以根据提供的环境变量 (CF_FUNCTION_NAME) 动态加载和运行函数(monorepo 架构):

# main.py
import logging
import os
from importlib import import_module

def get_function(function_name):
    return getattr(import_module(f"functions.{function_name}"), function_name)

def do_nothing(*args):
    return "no function"

cf_function_name = os.getenv("CF_FUNCTION_NAME", False)
disable_logging = os.getenv("CF_DISABLE_LOGGING", False)

def run(*args):
    if not disable_logging and cf_function_name:
        import google.cloud.logging
        client = google.cloud.logging.Client()
        client.get_default_handler()
        client.setup_logging()
        print("Logging enabled")
    cf = get_function(cf_function_name) if cf_function_name else do_nothing
    return cf(*args)

这工作正常,除了一些与 Stackdriver 日志记录相关的问题:

  • 打印语句“Logging enabled”应该在每次调用时打印,但只打印一次?
  • 日志中缺少动态加载函数中引发的异常,而日志仅显示“已完成状态崩溃”,这不是很有用。

多个后续执行的堆栈驱动程序日志的屏幕截图: stackdriver screenshot

这里有什么我遗漏的吗? 我的功能动态加载是否会影响日志记录?

谢谢。

【问题讨论】:

    标签: google-cloud-platform google-cloud-functions stackdriver


    【解决方案1】:

    我在这里没有看到任何问题。第一次加载函数时,会创建一个实例并启用日志记录(您的日志记录跟踪)。然后,实例会一直保持到被驱逐(不可预测!)。

    如果您想查看多个跟踪,请同时执行 2 个调用。 Cloud Function 实例只能同时处理一个请求。 2 次并行调用意味着创建另一个实例,从而进行新的日志记录初始化。

    关于例外,同样的事情。如果您不捕获并打印它,则不会记录任何内容。抓住他们!

    【讨论】:

      【解决方案2】:

      Cloud Functions 和 Python 似乎存在一个月的问题,错误没有通过回溯自动记录并正确归类为“错误”:GCP Cloud Functions no longer categorizes errors correctly with tracebacks

      【讨论】:

        猜你喜欢
        • 2018-07-02
        • 2021-06-16
        • 1970-01-01
        • 2018-11-28
        • 2020-06-19
        • 1970-01-01
        • 2017-11-14
        • 2016-06-18
        • 1970-01-01
        相关资源
        最近更新 更多