Python 3.x Google云函数Python日志问题
我不知道该怎么说,但是,我觉得在我不知道的情况下,谷歌改变了一些东西。我过去常常从日志仪表板中的谷歌云控制台中的python云函数获取日志。现在,它停止工作了 所以我调查了很长时间,我只是做了一个日志hello world python云函数:Python 3.x Google云函数Python日志问题,python-3.x,logging,google-cloud-platform,google-cloud-functions,Python 3.x,Logging,Google Cloud Platform,Google Cloud Functions,我不知道该怎么说,但是,我觉得在我不知道的情况下,谷歌改变了一些东西。我过去常常从日志仪表板中的谷歌云控制台中的python云函数获取日志。现在,它停止工作了 所以我调查了很长时间,我只是做了一个日志hello world python云函数: import logging def cf_endpoint(req): logging.debug('log debug') logging.info('log info') logging.warning('log warn
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时停止了对日志严重性参数的解析!如果我看起来很愚蠢,我很抱歉,但这是我唯一能想到的:/
你们对此有什么解释或解决办法吗?我做错了吗
提前感谢您的帮助。在使用Python本机模块时,不再支持Stackdriver日志记录严重性筛选器 但是,您仍然可以使用创建具有特定严重性的日志。查看Python库的参考,以及一些用例示例 请注意,为了让日志位于正确的资源下,您必须手动配置日志,请参阅以了解支持的资源类型。 同样,每种资源类型都有一些需要出现在日志结构中的资源 例如,以下代码将在Stackdriver Logging中向云函数资源写入一个日志,其严重性为
错误
:
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
请注意,
YOUR-CLOUD-FUNCTION-NAME
、YOUR-FUNCTION-LOCATION
和YOUR-PROJECT-ID
中的字符串需要特定于您的项目/资源。我遇到了同样的问题
在@joan Grau共享的链接中,我还看到了一种将云记录器与Python日志模块集成的方法,这样您就可以像往常一样使用Python根记录器,并且所有日志都将发送到StackDriver日志
我试过了,效果很好。简而言之,你可以用两种方法来做
将云记录器绑定到根日志的一种简单方法
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")
同样的问题在这里,水平不再设置-用于工作。
print()
也不会将级别(严重性)设置为INFO。应该是的,你已经向issuetracker报告了吗?我也是;我甚至尝试了json格式的日志有效负载,但没有成功,它带有“严重性”:“{INFO,ERROR,etc.}”。我创建了一个GCP支持案例,因为这对我来说显然是一个bug。谢谢你的回答Joan。坦率地说,在这一点上,我对谷歌有点失望。这一变化对开发人员非常不友好,而且是CF日志中基本严重性支持的一大倒退。文档还没有更新,云函数的一个基本特性变得更加冗长、不直观,而且配置起来也很麻烦。关于这是否是一个临时更改或我们应该如何预期它将继续进行的任何内部信息?除了日志记录(令人不安)之外,打印到标准或错误控制台也不会影响严重性。G是否也删除了该功能,并且仅针对Python??使用日志库不仅麻烦,而且在本地测试/开发功能时还需要监控SD日志,这很荒谬。谢谢你节省了我的时间。顺便说一句,我发现使用保留环境更方便标签={“function\u name”:os.getenv('function\u name'),“region”:os.getenv('function\u region')}
。另外,我尝试了不使用.format(“YOUR-PROJECT-ID”)
的方式,但仍然有效。请注意,这不适用于googlecloudlogging==2.0.0
。将使用谷歌云日志第二个解决方案很有帮助,谢谢。但是,日志不会区分警告和错误。这也不会记录异常和回溯