我在python 3.7中有一个Google App Engine项目,我想在其中写一些日志。 我习惯于在App Engine python 2.7中编程,而我使用的是简单代码:
logging.info('hi there!')
将任何日志写入Google云日志控制台。 上面的命令现在不再起作用,它说:
logging has no attribute 'info'
我搜索了,发现了这个可能的新代码
from flask import Flask
from google.cloud import logging
app = Flask(__name__)
@app.route('/l')
def hello():
logging_client = logging.Client()
log_name = LOG_NAME
logger = logging_client.logger(LOG_NAME)
text = 'Hello, world!'
logger.log_text(text, severity='CRITICAL')
return text
上面的代码在堆栈驱动器报告页面中没有任何错误,但在日志页面中什么也没有显示。
那么我如何在python3.7中为我的App Engine项目编写日志?
答案 0 :(得分:5)
第二代标准环境(包括python 3.7)比第一代标准环境(包括python 2.7)更贴近灵活环境。
如果第1代的自定义版本(由GAE团队维护)的许多API如果各自的功能或多或少地被替代的,更通用的涵盖,则它们(或至少尚未)移植到第二代中已经在灵活环境中使用的方法(大多数方法基于GAE以外的团队开发和维护的服务)。
您会在这两个迁移指南中注意到许多服务部分之间的相似性(这使我得出了上述总结结论):
日志记录是两个指南中列出的服务之一。第一代使用标准python logging
库的自定义版本(在Stackdriver成为独立服务之前)。对于第二代,日志记录只是被委派给使用现在普遍可用的Stackdriver logging服务(这是您显示的摘录的来源)。从日志记录(在第一个指南中):
请求日志不再自动关联,但仍将 出现在Stackdriver Logging中。使用Stackdriver Logging客户端 库来实现您所需的日志记录行为。
您显示的代码片段确实对应于Stackdriver Logging。但是您似乎直接Using the client library。我不知道这是否有问题(GAE通常会有所不同),但是也许您也可以尝试使用using the standard Python logging:
通过附加Stackdriver将所有日志条目发送到Stackdriver 将处理程序记录到Python根记录器,请使用
setup_logging
辅助方法:# Imports the Google Cloud client library import google.cloud.logging # Instantiates a client client = google.cloud.logging.Client() # Connects the logger to the root logging handler; by default this captures # all logs at INFO level and higher client.setup_logging()
附加处理程序后,默认情况下,信息级别为INFO或 应用程序中发出的更高的值将被发送到 Stackdriver记录:
# Imports Python standard library logging import logging # The data to log text = 'Hello, world!' # Emits the data using the standard logging module logging.warn(text)
其中也有一些GAE特定说明(但我不确定它们是否也涵盖第二代标准env):
Google App Engine默认授予Logs Writer role。
无需使用Python的Stackdriver Logging库即可 明确提供凭据。
已自动为App Engine启用Stackdriver Logging 应用程序。无需其他设置。
注意:写入 stdout 和 stderr 的日志会自动发送给您的Stackdriver Logging,而无需使用 适用于Python的Stackdriver Logging库。
也许值得一提的是,viewing the logs在第一代标准环境(应用日志将与请求日志紧密关联)之外可能也会有所不同。
还有Using Stackdriver Logging in App Engine apps指南。它没有特别提及第二代标准env(因此可能需要更新),但是对于可能有用的灵活环境有很好的提示。例如,如果丢失的请求日志相关性与Linking app logs and requests部分可能有关。
答案 1 :(得分:2)
即使日志在Python 2.7和3.7中的工作方式有所不同,Reading and Writing Application Logs in Python 2.7中提供的相同日志方法也应在Python 3.7中工作,因为写入stdout和stderr的日志仍会出现在Stackdriver Logging中。
Import logging
logging.getLogger().setLevel(logging.DEBUG)
logging.debug('This is a debug message')
logging.getLogger().setLevel(logging.INFO)
logging.info('This is an info message')
logging.warning('This is a warning message')
logging.error('This is an error message')
logging.critical('This is a critical message')
#logging.warn is deprecated
logging.warn('This is a warning' message)
=======================================
Import logging
app.logger.setLevel(logging.ERROR)
app.logger.error('This is an error message')
但是,日志条目不再像Python 2.7中那样自动与请求相关联,这就是为什么您以纯文本形式看到它们的原因。我创建了一个功能请求来解决此问题,您可以按照here进行操作。