GAE-Python 3.7-如何记录?

时间:2018-10-30 12:10:15

标签: google-app-engine logging python-3.7

我在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项目编写日志?

2 个答案:

答案 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进行操作。