代码之家  ›  专栏  ›  技术社区  ›  Paolo177

GAE-python3.7-如何记录?

  •  0
  • Paolo177  · 技术社区  · 6 年前

    我习惯于在应用程序引擎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中为我的appengine项目编写日志呢?

    2 回复  |  直到 6 年前
        1
  •  14
  •   Dan Cornilescu    6 年前

    第二代标准环境(包括Python3.7)比第一代标准环境(包括Python2.7)更接近灵活的环境。

    您将注意到这两个迁移指南中的许多服务部分之间的相似性(这使我得出了上面的总结结论):

    日志记录是两个指南中列出的服务之一。第一代使用了标准python的定制版本 logging 库(在Stackdriver成为独立服务之前)。对于第二代日志记录,只需使用现在普遍可用的 Stackdriver logging

    请求日志不再自动关联,但仍将 库来实现所需的日志记录行为。

    您显示的代码片段实际上对应于Stackdriver日志记录。但你看起来 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()
    

    附加处理程序后,默认情况下,任何位于信息级别或 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日志库可以在不需要 明确提供凭据。

    自动为应用程序引擎启用Stackdriver日志记录

    注意 :日志写入 标准 自动发送到Stackdriver日志,无需使用 Python的Stackdriver日志库。

    也许值得注意的是 viewing the logs

    另外还有 Using Stackdriver Logging in App Engine apps 指南。它没有特别提到第二代标准env(因此它可能需要更新),但是对灵活的环境有很好的提示 可以 Linking app logs and requests 部分 可以 如果丢失的请求日志相关与此有关,请感兴趣。

        2
  •  2
  •   David    6 年前

    尽管在python2.7和3.7中日志记录的工作方式不同,但是 Reading and Writing Application Logs in Python 2.7

    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')
    

    但是,日志条目不再像python2.7那样自动与请求关联,这就是为什么您可以在纯文本中看到它们。我已经创建了一个功能请求来解决这个问题,您可以按照它来操作 here .