概览
当您的应用收到请求时,App Engine 会自动写入请求日志。在处理请求的过程中,您的应用也可以写入应用日志。在本页面中,您将了解如何从您的应用写入应用日志、如何在 Google Cloud 控制台中查看日志记录,以及如何理解 App Engine 在请求过程中写入的请求日志数据。
如需了解如何下载日志数据,请参阅日志导出概览。
请求日志与应用日志
日志数据分为两类:请求日志和应用日志。对于您的应用处理的每个请求,App Engine 会自动写入请求日志,请求日志中包含项目 ID、HTTP 版本等信息。
写入应用日志
调用内置 PHP 函数 syslog()
时,您可以使用 Logs PHP API 写入日志。例如:
if (authorizedUser()) {
echo '<p>Welcome authorized user</p>';
syslog(LOG_INFO, 'Authorized access');
} else {
echo 'Go away unauthorized user<p />';
syslog(LOG_WARNING, "Unauthorized access");
}
在写入 syslog
之前,您无需调用 openlog()
或 closelog()
。对这些函数的调用将被忽略。
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。