使用 Google Cloud Console 导出日志

本页面介绍了如何使用 Cloud Console 和 gcloud 命令行工具导出日志条目。

您还可以使用 Cloud Logging API 导出日志条目。

如需从概念上简要了解如何导出日志,请参阅日志导出概览。概括地说,您可以通过创建包含日志过滤条件导出目标位置的一个或多个接收器来导出日志。Cloud Logging 在收到新的日志条目后,会将这些日志条目与每个接收器进行对比。如果某个日志条目与接收器的过滤条件匹配,则会将该日志条目的副本写入导出目标位置。

您可以将日志导出到以下目标位置:

如需了解如何设置导出日志的格式和对其进行整理,以及如何查看导出的日志,请转到使用导出的日志

使用日志浏览器和日志路由器创建和管理接收器

使用 Cloud Console,您可以执行以下操作:

  • 在一个位置集中查看所有接收器。
  • 在创建接收器之前,请先查看接收器查询所匹配的日志条目。
  • 为接收器创建导出目标位置并为其授权。

但是,Cloud Console 只能在项目中创建或查看接收器。如需在组织、文件夹或结算帐号中使用 gcloud 命令行工具或 Cloud Logging API 创建接收器,请参阅汇总接收器

在创建接收器之前,请先验证以下内容:

  • 您有一个 Google Cloud 项目,且您可以在日志浏览器中查看其中包含的日志。

  • 您具有 Cloud 项目的 OwnerLogging/Logs Configuration Writer IAM 角色,可以创建、删除或修改接收器。如需了解详情,请转到权限和角色

  • 您具有目标服务或能够创建目标服务。

创建接收器

如需从“日志浏览器”页面创建接收器,请选择操作 > 创建接收器

显示“创建接收器”选项的菜单。

如需从日志路由器页面创建接收器,请选择创建接收器

从日志路由器中选择“创建接收器”

选择创建接收器后,请在创建日志路由接收器面板中完成以下步骤:

  1. 输入接收器详情

    • 接收器名称:提供接收器的标识符。

    • 接收器说明(可选):描述接收器的用途或使用场景。

  2. 输入接收器目标位置

    • 选择接收器服务:选择您想要路由日志的目标服务。

    您可以使用以下服务和目标位置:

    • Cloud Logging 日志存储分区:选择或创建日志存储分区
    • BigQuery:选择或创建用于接收导出日志的特定数据集。您还可以选择使用分区表
    • Cloud Storage:选择或创建用于接收导出日志的特定 Cloud Storage 存储分区。
    • Pub/Sub:选择或创建用于接收导出日志的特定主题。
    • Splunk:为您的 Splunk 服务选择 Pub/Sub 主题。
    • 其他项目:按以下格式添加 Google Cloud 服务和目标位置:

      SERVICE.googleapis.com/projects/PROJECT_ID/DESTINATION/DESTINATION_ID
      

      例如,如果导出目标位置是 BigQuery 数据集,则接收器目标位置将如下所示:

      bigquery.googleapis.com/projects/PROJECT_ID/datasets/DATASET_ID
      

  3. 选择要包含在接收器中的日志

    • 构建包含过滤条件:输入过滤条件以便选择要路由到接收器目标位置的日志。

    您可能希望构建一个能够将所有数据访问日志都路由到单个存储分区的过滤条件。此过滤条件大致如下所示:

    LOG_ID("cloudaudit.googleapis.com/data_access") OR LOG_ID("externalaudit.googleapis.com/data_access")
    

    要验证您输入的过滤条件是否正确,请选择预览日志。此操作会在新标签页中打开日志浏览器且其中预填充了过滤条件。如需了解如何创建过滤条件,请参阅日志记录查询语言

  4. 选择要从接收器中排除的日志(可选)

    • 构建排除项过滤条件:选择添加排除项,并输入过滤条件以选择您不想路由到接收器目标位置的日志。

    • 排除项过滤条件名称:为排除项过滤条件提供标识符。

    • 排除项过滤率:提供一个介于 0100 之间的整数。与排除项过滤条件匹配的传入日志将根据该值进行采样。

      值为 0 会对与过滤条件匹配的日志进行 0% 的采样;因此,0 相当于停用排除项过滤条件。值为 100 会对所有日志进行 100% 的采样;因此,与排除项过滤条件匹配的所有日志都会从目标位置中排除。值为 50 会对与排除项过滤条件匹配的日志进行 50% 的采样;因此,将会排除与排除项匹配的日志的 50%,然后将剩余的 50% 路由到目标位置。

      您最多可以为每个接收器创建 50 个排除项过滤条件。

  5. 选择创建接收器

与接收器的过滤条件匹配的新日志条目将被路由到接收器的目标位置。系统会立即流式传输进入到日志存储分区、BigQuery 或 Pub/Sub 的日志条目。目标服务为 Cloud Storage 的日志条目按大约每小时一次的频率进行批处理和发送。如需了解如何在导出的目标位置中查看日志,请参阅使用导出的日志

如果 Logging 在尝试将日志导出到导出目标位置时遇到错误,则相应错误会显示在项目的活动流中。在 Google Cloud Console 的项目主页顶部选择活动。如需诊断常见错误,请转到下面的问题排查

将日志导出到另一个 Google Cloud 项目

您可以将日志导出到不同于创建接收器的 Cloud 项目中的目标位置。

为此,您必须执行以下任一操作:

  • 在您要向其发送日志的 Cloud 项目中具有以下任一 IAM 权限:

    • Owner (roles/owner)
    • Logging Admin (roles/logging.admin)
    • Logs Configuration Writer (roles/logging.configWriter)
  • 为接收器的服务帐号授予对目标位置进行写入的 roles/logging.logWriter 角色。

如需详细了解如何为接收器的服务帐号提供适当权限,请参阅目标位置权限。如需查看 Logging 角色和权限的列表,请参阅访问权限控制

管理接收器

创建接收器后,您可以在日志路由器页面中对其进行查看,然后在该页面执行以下操作:

  • 查看接收器的详细信息
  • 修改接收器
  • 停用接收器
  • 删除接收器

如需从“日志记录”菜单中转到“日志路由器”页面,请选择日志路由器

转到“日志路由器”

日志路由器页面包含接收器表摘要。表中的每一行都包含与日志导出中所述的某些接收器属性相对应的信息:

  • 类型:接收器的目标位置类型。
  • 名称:当前项目中接收器的标识符。
  • 说明:接收器的说明。
  • 目标位置:导出日志条目的存储位置的全名。
  • 状态:指示是启用还是停用接收器。

表中每一行都有一个菜单 ,并提供以下选项:

  • 查看接收器详情:显示接收器的名称、说明、服务、目标位置以及包含和排除过滤条件。选择修改后,您可以更改接收器的属性。
  • 修改接收器:打开修改接收器面板,您可在其中更改接收器的参数。
  • 停用接收器:允许您停用接收器并停止将日志路由到接收器的目标位置。

  • 启用接收器:用于启用已停用的接收器,并重新开始将日志路由到接收器的目标位置。

  • 删除接收器:允许您删除接收器,并停止将日志路由到接收器的目标位置。无法删除 _Default_Required 接收器,但您可以停用 _Default 接收器以停止将日志路由到 _Default 日志存储分区。

点击任意列名称可按升序或降序对数据进行排序。在表格的底部,您还可以选择要显示的行数。

使用 gcloud 命令行工具创建和管理接收器

如需创建接收器,请运行 gcloud alpha logging sinks create 命令:

gcloud alpha logging sinks create SINK_NAME SINK_LOCATION OPTIONAL_FLAGS

例如,如需创建以 Cloud Logging 日志存储分区为目标位置的接收器,请运行以下命令:

gcloud alpha logging sinks create my-sink logging.googleapis.com/projects/myproject123/locations/global/buckets/my-bucket \
  --log-filter='logName="projects/myproject123/logs/matched"' --description="My first sink"

将日志从一个项目路由到另一项目中的存储分区

如需将当前项目的日志路由到其他项目的存储分区,请完成以下步骤。

请注意,跨项目存储分区接收器需要向 Logging 为其创建的服务帐号添加适当的 Identity and Access Management 权限

  1. 在另一项目中创建一个存储分区(如果您尚未创建):

     gcloud alpha logging buckets create BUCKET_ID --project=DESTINATION_PROJECT_ID
    
  2. 创建接收器,以将日志路由到另一个存储分区:

     gcloud alpha logging sinks create SINK_NAME \
       logging.googleapis.com/projects/DESTINATION_PROJECT_ID/locations/global/buckets/BUCKET_ID \
       --log-filter='FILTER_CONDITIONS'
    
  3. 从接收器中的 writerIdentity 字段获取服务帐号:

     gcloud alpha logging sinks describe SINK_NAME
    

    服务帐号格式类似于以下内容:

     serviceAccount:p123456789012-12345@gcp-sa-logging.iam.gserviceaccount.com
    
  4. roles/logging.bucketWriter 角色授予服务帐号。

    1. 获取目标项目的 Identity and Access Management 政策,并将其写入 JSON 格式的本地文件:

      gcloud projects get-iam-policy DESTINATION_PROJECT_ID --format json > output.json
      
    2. 添加一个 IAM 条件,仅允许服务帐号写入您创建的存储分区。例如:

       {
         "bindings": [
           {
             "members": [
               "user:username@gmail.com"
             ],
             "role": "roles/owner"
           },
           {
             "members": [
               "[SERVICE_ACCOUNT]"
             ],
             "role": "roles/logging.bucketWriter",
             "condition": {
                 "title": "Bucket writer condition example",
                 "description": "Grants logging.bucketWriter role to service account [SERVICE_ACCOUNT] used by log sink [SINK_NAME]",
                 "expression":
                   "resource.name.endsWith("locations/global/buckets/BUCKET_ID")"
             }
           }
         ],
         "etag": "BwWd_6eERR4=",
         "version": 3
       }

    3. 更新 IAM 政策:

      gcloud projects set-iam-policy DESTINATION_PROJECT_ID output.json
      

停止提取日志

当您通过停用 _Default 接收器和其他路由到 _Default 存储分区的接收器来停用 _Default 存储分区的日志提取功能后,Cloud Logging 将停止提取日志以及将日志数据存储在 _Default 存储分区中。然后,_Default 存储分区会包含日志,直到满足以下两个条件:

  • 没有接收器路由到 _Default 存储分区。

  • 存储分区上的保留期限已过期。

停用将日志发送到 _Default 存储分区的所有接收器后,Cloud Logging 将不再因将新日志提取到该存储分区而产生费用。

如需停用日志提取功能,请完成以下步骤:

  1. 转到“日志路由器”。

    转到“日志路由器”

  2. 如需查找将日志路由到 _Default 存储分区的所有接收器,请按目标位置过滤接收器,然后输入 _Default

    查找将日志路由到默认存储分区的所有接收器

  3. 对于每个接收器,选择菜单 ,然后选择停用接收器

    已停用默认接收器

接收器现已停用,Cloud Logging 不再将日志路由到 _Default 存储分区。

目标位置权限

本部分介绍如何向 Logging 授予身 Identity and Access Management 权限,以将导出的日志写入接收器的导出目标位置。

当您创建接收器后,Logging 会为该接收器创建一个新的服务帐号(称为唯一写入者身份)。您无法直接管理此服务帐号,因为它由 Cloud Logging 拥有和管理。如果接收器被删除,则此服务帐号也会被删除。

您的导出目标位置必须允许此服务帐号写入日志条目。如需设置此权限,请完成以下步骤:

  1. 在 Cloud Console、gcloud logging 命令行界面或 Logging API 中创建新接收器。

  2. 如果您在 Cloud Console 中创建了接收器并且拥有对目标位置的 Owner 访问权限,那么 Cloud Logging 应该已经代表您设置了必要的权限。如果 Cloud Logging 确实已经这样做了,则表示您已大功告成。如果没有,请继续操作。

  3. 从新接收器获取接收器的写入者身份,也就是一个电子邮件地址:

    • 如果您使用的是 Cloud Console,请转到日志路由器页面,然后选择菜单 > 查看接收器详情。写入者身份会显示在接收器详情面板中。
    • 如果您使用的是 gcloud logging,则系统会在您列出接收器时显示写入者身份。
    • 如果您使用的是 Logging API,则可以从 LogSink 对象获取写入者身份。
  4. 如果您拥有对目标位置的所有者访问权限,则按以下方式将服务帐号添加到目标位置:

    • 对于 Cloud Storage 目标位置,将接收器的写入者身份添加到存储分区,并为其指定 Storage Object Creator 角色。
    • 对于 BigQuery 目标位置,将接收器的写入者身份添加到数据集,并为其提供 BigQuery Data Editor 角色。
    • 对于 Cloud Pub/Sub,将接收器的写入者身份添加到您的主题,并为其指定 Pub/Sub Publisher 角色。
    • 对于日志存储分区目标位置,将接收器的写入者身份添加到日志存储分区,以为其授予 roles/logging.bucketWriter 权限。
  5. 如果您没有对导出目标位置的 Owner 访问权限,则将写入者身份服务帐号名称发送给具有该权限的人员。然后,该人员应按照上一步骤中的说明将写入者身份添加到导出目标位置。

授权延迟

如果接收器尝试导出某个日志条目,但缺少对导出目标位置的相应 IAM 权限,则接收器会报告错误并跳过该日志条目。这种情况将持续到接收器获得授权,然后接收器将开始导出新的日志条目。

在创建接收器之后,需要等一段时间才能使用接收器的新服务帐号授权写入导出目标位置。创建接收器后的前 24 小时内,您可能会在项目的活动页上看到来自接收器的与权限相关的错误消息;您可以忽略它们。

问题排查

以下是在导出日志时可能会遇到的一些常见问题,以及相关处理方法:

  • 目标位置出现错误:检查接收器中导出目标位置的规范。使用 projects.sinks.get 查找接收器的写入者身份,并确保该身份具备对导出目标位置的写入权限。

  • 没有导出任何日志:以下是一些可能的原因:

    • 您的查询不正确。检查导出查询,以确认与查询匹配的日志条目是否刚刚出现在 Logging;更正拼写错误或格式设置错误。

    • 自接收器创建或更新后,尚未收到任何匹配的日志条目;仅导出新的日志条目。

      您可能需要等待一段时间才能在目标位置中查看导出的日志。使用 Cloud Storage 目标位置时尤其如此。如需了解详情,请转到导出日志的可用性

      您还可以查看导出系统指标。导出系统指标可以告诉您导出了多少日志条目以及由于错误而丢弃了多少日志条目。

修正错误后,您的接收器将开始导出日志。

如需使用旧版日志查看器查看接收器错误,请执行以下操作:

  1. 转到在其中创建接收器的项目或其他资源的活动流

    转到“活动流”

  2. 过滤条件面板中,依次选择活动类型 > 配置资源类型 > 日志导出接收器

  3. 调整日期/时间以查看相应时间范围内的接收器错误。

    系统会显示接收器错误。

以下部分列出了一些可能出现的服务特定的错误和意外结果,并说明了相关处理方法。

导出到 Cloud Storage 时出错

下表列出了将日志导出到 Cloud Storage 时最常见的错误:

错误 原因 解决方案
存储分区“[YOUR_BUCKET]”的现有权限不允许日志组创建新对象。 接收器的写入者身份没有对存储分区的正确权限。 向存储分区添加必要的权限或将接收器更新为使用其他存储分区。请参阅目标位置权限
没有名为“[YOUR_BUCKET]”的存储分区。 存储分区名称中可能存在错误,或者存储分区可能已被删除。 使用正确的存储分区目标位置更新接收器。
接收器已成功创建。但是,我们无法向目标位置授予正确的权限。 存储分区创建后,存储分区的访问控制模型已设置为统一

(添加服务帐号后,持续显示此错误消息。)
在创建存储分区时,选择精细访问控制模型。对于现有存储分区,您可以使用权限标签页在存储分区创建后的前 90 天更改访问控制模型。

导出到 BigQuery 时出错

下表列出了将日志导出到 BigQuery 时最常见的错误:

错误 原因 解决方案
数据集“[YOUR_DATASET]”的现有权限不允许日志组创建新表。 接收器的写入者身份对数据集没有足够的权限。 为相应数据集添加权限。请参阅目标位置权限
没有名为“[YOUR_DATASET]”的数据集。 接收器的目标位置可能存在错误,或者有人可能已删除数据集。 重新创建数据集或将导出接收器更新为使用其他数据集。
传输到数据集“[YOUR_DATASET]”中的“[YOUR_TABLE]”表的日志与表架构不匹配。 您正在尝试导出与当前表架构不兼容的日志。 确保您的日志条目与表架构匹配。常见问题包括发送数据类型不同的日志条目。例如,日志条目中的一个字段是整数,而架构中的相应列为字符串类型。活动流中包含指向一个无效日志条目的链接。修复错误源后,您可以重命名当前表,并让 Logging 再次创建该表。
数据集“[YOUR_DATASET]”中的表“[YOUR_TABLE]”已超出每个表的流式插入配额。 您导出的日志条目过多且导出速度过快。请参阅适用于日志流式传输的 BigQuery 默认配额限制 减少接收器生成的日志数据量。您可以更新接收器的查询,以匹配更少的日志条目,或使用 sample() 函数
流式传输到分区表“[YOUR_TABLE]”的日志在允许的时间范围之外。 BigQuery 不接受日期距现在过于久远的日志(过去或未来)。 无法使用接收器导出允许的时间范围以外的日志。您可以将这些日志导出到 Cloud Storage 并改为运行 BigQuery 加载作业。如需详细了解说明,请参阅 BigQuery 文档
日志无法流式传输到数据集“[YOUR_DATASET]”,因为组织政策禁止执行该操作。 存在阻止写入到所选数据集的组织政策。如需详细了解组织政策,请参阅文档 修改导出接收器以使用兼容的数据集。

将日志导出到 Pub/Sub 时出错

下表列出了将日志导出到 Pub/Sub 时最常见的错误:

错误 原因 解决方案
[ACCOUNT] 需要有 [PROJECT] 的修改权限才能发布到 [TOPIC] 接收器的写入者身份没有对主题的正确权限。 为项目添加必要的权限。请参阅目标位置权限
主题“[TOPIC]”不存在。 您可能删除了为接收导出日志而配置的主题。 使用同一名称重新创建主题,或将导出配置更改为使用其他主题。

后续步骤