读取和写入应用日志

概览

当您的应用收到请求时,App Engine 会自动写入请求日志。在处理请求的过程中,您的应用也可以写入应用日志。在本页面中,您将了解如何从您的应用写入应用日志、如何在 Google Cloud Console 中查看日志记录,以及如何理解 App Engine 在请求过程中写入的请求日志数据。

如需了解如何下载日志数据,请参阅日志导出概览

请求日志与应用日志

日志数据分为两类:请求日志和应用日志。对于由您的应用处理的每个请求,App Engine 会自动写入请求日志,该日志中包含项目 ID、HTTP 版本等信息。如需查看请求日志的完整可用属性列表,请参阅 RequestLog。如需获取请求日志字段的说明,另请参阅请求日志表

每个请求日志均包含一个与该请求关联的应用日志 (AppLog) 列表,此列表在 RequestLog.app_logs 属性中返回。每个应用日志包含日志的写入时间、日志消息和日志级别。

写入应用日志

请阅读 Python.org 上提供的标准 Python logging 模块文档,这会对您很有帮助。

借助 Python logging 模块,开发者可以按以下 5 个严重性级别记录日志:

  • 调试
  • 信息
  • 警告
  • 错误
  • 严重

以下示例展示了如何使用不同的日志记录级别:

import logging

import webapp2

class MainPage(webapp2.RequestHandler):
    def get(self):
        logging.debug('This is a debug message')
        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')

        try:
            raise ValueError('This is a sample value error.')
        except ValueError:
            logging.exception('A example exception log.')

        self.response.out.write('Logging example.')

app = webapp2.WSGIApplication([
    ('/', MainPage)
], debug=True)

Google Cloud 控制台中的日志网址格式

如需查看 Google Cloud 控制台中日志网址格式的示例,请参阅以下示例网址:

https://console.cloud.google.com/logs?filters=request_id:000000db00ff00ff827e493472570001737e73686966746361727331000168656164000100

在控制台中读取日志

如需查看在标准环境中运行的应用写入的日志,请使用日志浏览器

典型的 App Engine 日志包含 Apache 组合日志格式的数据,以及一些特殊的 App Engine 字段,如以下示例日志中所示:

192.0.2.0 - test [27/Jun/2014:09:11:47 -0700] "GET / HTTP/1.1" 200 414
"http://www.example.com/index.html"
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36"
"1-dot-calm-sylph-602.appspot.com" ms=195 cpu_ms=42 cpm_usd=0.000046
loading_request=1 instance=00c61b117cfeb66f973d7df1b7f4ae1f064d app_engine_release=

了解请求日志字段

下表按出现顺序列出字段,并提供相应说明:

字段顺序 字段名称 始终存在? 说明
1 客户端地址 客户端 IP 地址。示例:192.0.2.0
2 RFC 1413 身份 客户端的 RFC 1413 身份。该字段几乎始终为字符 -
3 用户 仅当应用使用 Users API 且用户已登录时,此字段才会显示。此值是 Google 账号的“昵称”部分,例如,如果 Google 账号是 test@example.com,则此字段中记录的昵称是 test
4 时间戳 请求时间戳。示例:[27/Jun/2014:09:11:47 -0700]
5 请求查询字符串 请求的第一行,包含方法、路径和 HTTP 版本。示例:GET / HTTP/1.1
6 HTTP 状态代码 返回的 HTTP 状态代码。示例:200
7 响应大小 响应大小(以字节为单位)。示例:414
8 引荐来源路径 如果没有引荐来源,则日志不包含路径,而是只显示 -。示例引荐来源路径:"http://www.example.com/index.html"
9 用户代理 识别 Web 服务器的浏览器和操作系统。示例:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36
10 主机名 客户端连接到 App Engine 应用所用的主机名。示例:(1-dot-calm-sylph-602.appspot.com)
11 时钟时间 App Engine 为请求花费的总时钟时间(以毫秒为单位)。该持续时间不包括在客户端和运行应用实例的服务器之间花费的时间。示例:ms=195
12 CPU 毫秒数 完成请求所需的 CPU 毫秒数。这是 CPU 实际执行应用代码所花费的毫秒数,以基准 1.2 GHz Intel x86 CPU 表示。如果实际使用的 CPU 速度比基准速度快,则 CPU 毫秒数可能大于上面定义的实际时钟时间。示例:cpu_ms=42
13 退出代码 仅当实例在获得请求后关闭时,此字段才会显示。格式为 exit_code=XXX,其中 XXX 是与实例关闭原因相对应的 3 位数。此过程不记录退出代码,因为它们主要用于帮助 Google 发现和修复问题。
14 估算的费用 已弃用。1000 次此类请求的估算费用(以美元为单位)。示例:cpm_usd=0.000046
15 队列名称 所用任务队列的名称。仅当请求使用任务队列时,此字段才会显示。示例:queue_name=default
16 任务名称 任务队列中为此请求执行的任务的名称。仅当请求导致任务排入队列时,此字段才会显示。示例:task_name=7287390692361099748
17 待处理队列 仅当请求在待处理队列中花费了一些时间时,此字段才会显示。如果您的日志中有许多待处理队列和/或值非常高,这可能意味着您需要更多的实例来处理流量。示例:pending_ms=195
18 加载请求 仅当请求为加载请求时,此字段才会显示。这意味着必须启动一个实例。理想情况下,您的实例应该在尽可能长的时间里保持良好的运行状况,能够在被回收并需要重新启动之前处理大量的请求。这意味着您不应该在自己的日志中看到太多此类请求。示例:loading_request=1
19 实例 处理请求的实例的唯一标识符。示例:instance=00c61b117cfeb66f973d7df1b7f4ae1f064d
20 版本 正式版 App Engine 中使用的当前 App Engine 版本:

配额和限制

您的应用受以下日志相关配额的影响:

  • 通过 Logs API 检索的日志数据。
  • 日志提取配额和保留。

检索数据的配额

每天通过 Logs API 调用检索的前 100 MB 日志数据均免费。超出 100 MB 的数据每 GB 收费 0.12 美元。

日志提取配额

App Engine 应用的日志记录由 Google Cloud Observability 提供。如需详细了解日志记录的费用和限制,请参阅 Google Cloud Observability 价格。如需长期存储日志,您可以将 Google Cloud Observability 中的日志导出到 Cloud Storage、BigQuery 和 Pub/Sub

开发服务器和 Logs API

默认情况下,日志仅存储在开发服务器的内存中;若要测试 Logs API 功能,您可以访问这些日志。如果您想要将开发服务器中的日志持久保留在您所选位置的磁盘,请为 --logs_path 命令行选项提供目标路径和文件名,如下所示:

   python2 [DEVAPPSERVER_ROOT]/google_appengine/dev_appserver.py --logs_path=your-path/your-logfile-name your-app-directory