您应该使用哪个:Logging 代理还是客户端库?

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

本文档提供的信息可帮助您决定是以编程方式使用客户端库还是使用 Logging 代理将应用日志发送到 Cloud Logging。如果您无法使用客户端库或 Logging 代理,或者只想试验一下,可以使用 gcloud logging write 命令或将 HTTP 命令发送到 Cloud Logging API 端点 entries.write 来写入日志。

Cloud Logging API 支持 HTTP 和 gRPC 调用。Ops Agent 和大多数 Logging 客户端库调用 gRPC Logging API。适用于某些语言的旧版 Logging 代理和客户端库会调用 REST Logging API。

如果您使用了代理,则您的应用可以使用任何一个现有的日志记录框架发出日志。例如,在 Google Kubernetes Engine 或 Container-Optimized OS 等容器环境中,代理会自动从 stdoutstderr 收集日志。在虚拟机 (VM) 上,代理会从已知文件位置或日志记录服务(如 Windows Event Logjournaldsyslogd)收集日志。

选择代理或客户端库

在代理或客户端库之间做出决定时,请考虑以下问题:

您的应用是否在 Google Cloud 外部运行?

如果您的应用未在 Google Cloud 上运行,您需要通过某种方式向 Logging API 发送日志。在这种情况下,您可以使用客户端库直接从应用将日志路由到 Logging。对于临时计算环境(例如无服务器计算),您必须使用客户端库直接调用 Logging API。

如需将日志从本地系统路由到 Logging,您还可以使用由 Blue Medora 提供的 BindPlane

运行应用的 Google Cloud 服务是否支持通过 stdoutstderr 自动注入日志?

某些 Google Cloud 服务是全代管式服务,因此您无需使用代理来路由日志。您可以使用任意语言(例如 Go、Node.js 和 Python)通过任意现有的日志记录框架将日志路由到默认支持 stdoutstderr 的产品中的 Logging。与使用客户端库相比,通过 stdoutstderr 提取日志的一个优点是应用崩溃不会破坏日志提取。如需了解如何通过 stdoutstderr 注入结构化日志,请参阅您的应用能否灵活更改日志格式?部分。

您可以使用 Logging 客户端库,但请注意,这可能会在 Logging 中引入用于本地测试的依赖项(您不一定需要它时)。使用客户端库可能还需要使用更复杂的编码来明确处理缓冲和重试。此外,每次使用 Logging 客户端库都会创建指向 API 的新连接流。这些新连接会增加复杂性,使用其他端口,并且仅使用应用中的日志发送单独的请求,如果没有太多日志,这可能会造成浪费。

是否需要能够在本地环境中访问应用日志?

如果您需要在本地环境中访问应用日志,以进行调试和其他目的,则可以使用某些语言的日志记录模块输出到 stdoutstderr。某些语言的 Logging 客户端库支持将日志路由到 stdoutstderr

在不支持通过 stdoutstderr 自动日志提取的 Google Cloud 服务中运行应用时,您可以收集磁盘文件中的 stdoutstderr 日志,并配置代理以抓取这些日志并将其发送到 Logging。如需了解详情,请参阅 Ops AgentLogging 代理的配置指南。

代理安装过程是手动还是自动?

某些服务会自动安装代理,或者允许您自行安装代理。如果您使用的服务不允许您安装代理,则必须使用客户端库来使用 Logging。

您是否已在系统中运行 Fluentd?

旧版 Logging 代理基于 Fluentd。

如果您已在系统中运行 Fluentd,并且还希望使用该守护程序进行 Logging 注入,则使用 fluentd 的 Google Cloud Logging 插件

您是否还收集 Cloud Monitoring 的应用指标?

在 Compute Engine 虚拟机中,Ops Agent 可以收集日志和大多数指标。如需了解详情,请参阅 Ops Agent 功能

如果 Ops Agent 不能应对您的使用场景,则您可以使用旧版 Cloud Monitoring 代理Monitoring 客户端库来收集指标。

您的应用是否能够灵活地更改日志格式?

此问题可帮助您确定应用能否生成结构化日志。 如果您以结构化日志记录格式将日志发送到 Logging API,则 Logging 可识别这些日志。客户端库提供处理此格式的方法。

写入结构化日志的方法有两种:一种方法是LogEntry 信封中设置特定自动字段,另一种方法是LogEntry 信封中设置 jsonPayload 字段。前者的架构由 Cloud Logging 决定,而后者的架构由用户决定。

您必须将代理配置为识别结构化日志。默认情况下,代理会配置为检测 JSON 格式的日志,并将其作为结构化日志进行处理。如果您的应用有自己的日志格式且无法更改,但您希望将日志识别为结构化日志,则必须以结构化日志记录格式(通常为 JSON)将日志写入 stdoutstderr,以便代理将它们识别为结构化日志。否则,您必须配置代理以理解自己的格式。

每个选项的摘要

日志记录模式示意图

  • Cloud Logging 客户端库

    • 优点

      • 您可以将日志直接路由到 Cloud Logging API。
      • 某些语言可以使用此库将日志输出到 stdoutstderr
    • 缺点

      • 应用崩溃会中断日志注入。
  • Ops Agent

    • 优点
      • Ops Agent 支持使用稳定的开源技术注入日志和指标:Fluent Bit(用于日志收集)和 OpenTelemetry 收集器(用于指标收集)。
      • 您可以在本地环境中保留日志。
      • 您或许可以从应用崩溃中恢复日志。
  • 旧版 Logging 代理

    • 优点
      • 代理使用 Fluentd 收集日志。
      • 您可以在本地环境中保留日志。
      • 您或许可以从应用崩溃中恢复日志。
    • 缺点
      • 代理目前受支持,但未处于积极开发阶段。
  • stdoutstderr 自动注入日志

    • 优点
      • 此过程是将日志发送到本地环境的常用方法。
      • 您可以使用任意日志记录库。
      • 您或许可以从应用崩溃中恢复日志。
    • 缺点
      • 并非所有环境都会自动将日志路由到 Logging。