当前位置: 首页 > 知识库问答 >
问题:

谷歌云函数Python日志问题

云承弼
2023-03-14

我不知道该怎么说,但我觉得谷歌在我不知情的情况下改变了一些东西。我过去常常从日志仪表板中Google Cloud Console中的python Cloud Functions获取日志。现在,它刚刚停止工作。

所以我去调查了很长时间,我只是做了一个日志 hello world python Cloud Function:

import logging

def cf_endpoint(req):
    logging.debug('log debug')
    logging.info('log info')
    logging.warning('log warning')
    logging.error('log error')
    logging.critical('log critical')
    return 'ok'

因此,这是我 main.py,我将其部署为具有http触发器的云函数。

因为我有一个包含所有“调试”级别日志的日志摄取排除过滤器,所以我在日志仪表板中看不到任何东西。但是当我把它拿掉的时候,我发现了这个:

因此,似乎将python内置日志记录解析为stackdriver的东西停止了对日志严重性参数的解析!如果我看起来很愚蠢,我很抱歉,但这是我唯一能想到的事情:/

你们对此有什么解释或解决办法吗?我做错了吗?

提前感谢您的帮助。

2022/01更新:

例如,现在的输出如下所示:

[INFO]: Connecting to DB ... 

严重性的下拉菜单如下所示:

使用“Default”作为显示Python日志记录所需的过滤器,这意味着只显示任何可用的日志,并且所有Python日志都在“Default”下,严重性仍然会下降。

共有3个答案

柴默
2023-03-14

不想处理云日志库,我创建了一个自定义格式化程序,它按照云日志的预期,使用正确的字段发出结构化日志。

class CloudLoggingFormatter(logging.Formatter):
    """Produces messages compatible with google cloud logging"""
    def format(self, record: logging.LogRecord) -> str:
        s = super().format(record)
        return json.dumps(
            {
                "message": s,
                "severity": record.levelname,
                "timestamp": {"seconds": int(record.created), "nanos": 0},
            }
        )

将此处理程序附加到记录器会导致对日志进行解析并在日志记录控制台中正确显示日志。在云函数中,我会将根记录器配置为发送到stdout并将格式化程序附加到它。

# setup logging
root = logging.getLogger()
handler = logging.StreamHandler(sys.stdout)
formatter = CloudLoggingFormatter(fmt="[%(name)s] %(message)s")
handler.setFormatter(formatter)
root.addHandler(handler)
root.setLevel(logging.DEBUG)
壤驷升
2023-03-14

我遇到了同样的问题。

在@joan Grau分享的链接中,我还看到了一种将云记录器与Python日志记录模块集成的方法,这样您就可以像往常一样使用Python根记录器,所有日志都会发送到StackDriver Logging。

https://googleapis.github.io/google-cloud-python/latest/logging/usage.html#integration-使用python日志模块

...

我试过了,很有效。简而言之,你可以用两种方法来做

将云记录器绑定到根日志的一种简单方法

from google.cloud import logging as cloudlogging
import logging
lg_client = cloudlogging.Client()
lg_client.setup_logging(log_level=logging.INFO) # to attach the handler to the root Python logger, so that for example a plain logging.warn call would be sent to Stackdriver Logging, as well as any other loggers created.

或者,您可以设置具有更细粒度控件的记录器

from google.cloud import logging as cloudlogging
import logging
lg_client = cloudlogging.Client()

lg_handler = lg_client.get_default_handler()
cloud_logger = logging.getLogger("cloudLogger")
cloud_logger.setLevel(logging.INFO)
cloud_logger.addHandler(lg_handler)
cloud_logger.info("test out logger carrying normal news")
cloud_logger.error("test out logger carrying bad news")
汝臻
2023-03-14

使用Python本机日志记录模块时,不再支持StackDrive日志记录严重性过滤器。

但是,您仍然可以通过使用Stackdr日志记录客户端库创建具有一定严重性的日志。参考Python库检查此留档,并检查此留档以获取一些用例示例。

请注意,为了让日志位于正确的资源下,您必须手动配置它们,请参阅此列表以了解支持的资源类型。此外,每个资源类型都有一些需要存在于日志结构中的必需标签。

例如,以下代码将在Stackdriver日志记录中向云函数资源写入日志,并出现错误严重性:

from google.cloud import logging
from google.cloud.logging.resource import Resource

log_client = logging.Client()

# This is the resource type of the log
log_name = 'cloudfunctions.googleapis.com%2Fcloud-functions' 

# Inside the resource, nest the required labels specific to the resource type
res = Resource(type="cloud_function", 
               labels={
                   "function_name": "YOUR-CLOUD-FUNCTION-NAME", 
                   "region": "YOUR-FUNCTION-LOCATION"
               },
              )
logger = log_client.logger(log_name.format("YOUR-PROJECT-ID"))
logger.log_struct(
 {"message": "message string to log"}, resource=res, severity='ERROR')

return 'Wrote logs to {}.'.format(logger.name) # Return cloud function response

请注意,“您的云函数名称”、“您的函数位置”“您的项目 ID”中的字符串需要特定于您的项目/资源。

 类似资料:
  • 我为API调用创建了一个Python函数,因此我不再需要在Power BI中这样做。它创建了5个XML文件,然后将它们合并成一个CSV文件。我希望该功能在谷歌云上运行(如果这不是一个好主意,请纠正我)。 我认为不可能在函数中创建XML文件(也许可以写入bucket),但理想情况下,我希望跳过XML文件的创建,直接创建CSV。 请在下面找到生成XML文件并合并为CSV的代码: 到csv 有什么想法吗

  • 我试图设置一个接收器,将某个特定的谷歌云平台日志导出到谷歌云存储桶,但无法使其工作,文档似乎与GCP控制台上发生的情况不匹配。 2)我选择“创建导出”并填写字段: 接收器名称=defaultServiceToGCSSink 下沉服务=Google Cloud 存储接收器目的地=mylogsbucket 点击OK后,我收到一条消息:未知用户电子邮件地址:defaultServiceTogcssink

  • 问题内容: 我需要执行一些python机器学习代码,并希望从Google Cloud Function中的节点进程执行它。 我想使用node,因为我有一些稍后要运行的firebase管理任务。我也有一个我满意的节点的部署工作流。 这可能吗?如果是这样,您能举个例子吗? 问题答案: 是的,这是可能的,您可能需要使用http://www.pyinstaller.org/来打包python代码。看看我的

  • 我使用logback在java的Google Cloud函数中打印日志。我想打印日文日志,但日志都是奇怪的字符。如何在Java代码中打印日志 我的登录设置如下 我打印日志的代码 日志是

  • 介绍如何在谷歌云平台获取在云联壹云平台需要使用的配置参数。 如何获取谷歌云服务帐号密钥信息? 纳管指定项目 打开“GCP Console中的IAM和管理-IAM页面”页面并登录。 单击顶部“选择项目”,选择需要授权的项目。 在左侧导航栏中选择“服务账号”,进入指定项目的服务账号页面。 单击 “创建服务账号” 按钮,进入创建服务账号页面。 配置服务账号名称、服务账号ID、服务账号说明等,单击 “创建

  • 我正在开发一个网络应用程序,代表用户获取谷歌广告活动的信息。我使用的是谷歌提供的python库,但我在获取开始测试API调用的初始凭据时遇到了很多麻烦。 我遵循以下文件:https://github.com/googleads/google-ads-python/wiki/OAuth-Web-Application-Flow 我已经完成了第一步,我有我的客户机密码、客户机ID和重定向uri。 在第