读取和写入应用日志

概览

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

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

请求日志与应用日志

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

每个请求日志均包含一个与该请求关联的应用日志 (AppLogLine) 列表,此列表在 RequestLogs.getAppLogLines() 方法中返回。每个应用日志包含日志的写入时间、日志消息和日志级别。

写入应用日志

App Engine Java SDK 允许开发者记录以下严重性级别:

  • SEVERE
  • WARNING
  • INFO
  • CONFIG
  • FINE
  • FINER
  • FINEST

日志级别 INFOWARNINGSEVERE 显示在日志中,没有额外的配置。要向 Java 应用中添加其他级别的日志记录,您需要将适当的系统属性添加到项目的 appengine-web.xml 文件中,并且您可能还需要修改 logging.properties 文件来设置所需的日志级别。这两个文件是在使用 Maven 创建新 App Engine Java 项目时随同创建的。您可以在以下位置找到这些文件:

Maven 项目布局

如需添加 INFOWARNINGSEVERE 以外的日志级别,请修改 appengine-web.xml 文件以在 <appengine-web-app> 代码中添加以下内容:

    <system-properties>
       <property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
    </system-properties>

logging.properties 中的默认日志级别为 INFO。如需更改应用中所有类的默认日志级别,请修改 logging.properties 文件以更改级别。例如,您可以将 .level = INFO 更改为 .level = WARNING

在应用代码中,使用 java.util.logging.Logger API 编写日志消息。下方示例编写的是 Info 日志消息:

import java.util.logging.Logger;
//...

public class MyClass {

  private static final Logger log = Logger.getLogger(MyClass.class.getName());
  log.info("Your information log message.");
  //....

应用运行时,App Engine 会记录消息,并在日志浏览器中提供这些消息。

Google Cloud Console 中的日志网址格式

如需查看 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