写入和查看日志

日志是用于调试和监控代码的重要工具。Cloud Functions 让您可以选择使用其 logger SDK、自定义 Google Cloud Logging 或是专为 Web 而开发的 console 对象标准。

写入日志

虽然在大多数情况下,我们都推荐使用 Cloud Functions logger SDK,但您可能会出于其他原因选择其他方案,比如:

  • 您原本已有代码库,不想从 console.log 进行重构。
  • 您熟悉 Cloud Logging(以前称为 Stackdriver Logging),并且希望用它进行自定义日志记录。

使用 Cloud Functions logger SDK

Cloud Functions logger SDK 提供了一个标准接口,该接口具有与 console.log 语句类似的 API,并支持其他日志级别。 您可以使用此 SDK 为包含结构化数据的事件记录日志,实现更轻松的分析和监控。

logger SDK 支持在通配符导入中包含日志条目。例如:

  const functions = require("firebase-functions");

  functions.logger.log("Hello from info. Here's an object:", someObj);

或者,您也可以使用单项导出。此示例演示了作为日志的最后一个参数附加到日志的结构化数据:

const { warn } = require("firebase-functions/lib/logger");

// Attach structured data to the log as the last argument.
warn("This is a 'WARNING' severity message with some metadata.", {
  key1: 'val1',
  key2: 'val2'
});
  • logger.log() 命令具有 INFO 日志级别。
  • logger.info() 命令具有 INFO 日志级别。
  • logger.warn() 命令具有 ERROR 日志级别。
  • logger.error() 命令具有 ERROR 日志级别。
  • 内部系统消息具有 DEBUG 日志级别。

借助 logger.write(),您可以为日志条目写入其他日志严重级别,包括 CRITICALALERTEMERGENCY。请参阅 LogSeverity

自定义 Cloud Logging 日志

使用 logger SDK 的 Cloud Functions 日志由 Cloud Logging 提供支持。您可以使用 Node.js 版 StackDriver Logging 库记录包含结构化数据的事件,实现更轻松的分析和监控。

const { Logging } = require('@google-cloud/logging');

// ...

// Instantiate the StackDriver Logging SDK. The project ID will
// be automatically inferred from the Cloud Functions environment.
const logging = new Logging();
const log = logging.log('my-custom-log-name');

// This metadata is attached to each log entry. This specifies a fake
// Cloud Function called 'Custom Metrics' in order to make your custom
// log entries appear in the Cloud Functions logs viewer.
const METADATA = {
  resource: {
    type: 'cloud_function',
    labels: {
      function_name: 'CustomMetrics',
      region: 'us-central1'
    }
  }
};

// ...

// Data to write to the log. This can be a JSON object with any properties
// of the event you want to record.
const data = {
  event: 'my-event',
  value: 'foo-bar-baz',

  // Optional 'message' property will show up in the Firebase
  // console and other human-readable logging surfaces
  message: 'my-event: foo-bar-baz'
};

// Write to the log. The log.write() call returns a Promise if you want to
// make sure that the log was written successfully.
const entry = log.entry(METADATA, data);
log.write(entry);

使用 console.log

如需从函数发出日志行,您可以使用标准的 JavaScript 日志记录调用,例如 console.logconsole.error

exports.helloError = functions.https.onRequest((request, response) => {
  console.log('I am a log entry!');
  response.send('Hello World...');
});
  • console.log() 命令具有 INFO 日志级别。
  • console.info() 命令具有 INFO 日志级别。
  • console.warn() 命令具有 ERROR 日志级别。
  • console.error() 命令具有 ERROR 日志级别。
  • 内部系统消息具有 DEBUG 日志级别。

如果使用 console.log,在从 Node.js 8 运行时迁移到 Node.js 10 或 12 时,您可能会遇到日志可读性问题。要暂时解决此问题,请将以下库添加到您的函数中:

require("firebase-functions/lib/logging/compat");

要迁移到 Node.js 10 或 12,建议的长期解决方案是重构代码以使用 logger SDK

查看日志

您可以在 Firebase 控制台或 Cloud Logging 界面中查看 Cloud Functions 的日志,也可以通过 firebase 命令行工具查看。

使用 Firebase CLI

要使用 firebase 工具查看日志,请使用 functions:log 命令:

firebase functions:log

如需查看特定函数的日志,请以参数形式提供函数名称:

firebase functions:log --only <FUNCTION_NAME>

如需了解全部日志查看选项,请参阅 functions:log 的帮助:

firebase help functions:log

使用 Firebase 控制台

您可以在 Firebase 控制台中查看 Cloud Functions 的日志

使用 Cloud Logging 界面

您可以在 Cloud Logging 界面中查看 Cloud Functions 的日志

分析日志

Cloud Logging 提供了一套功能强大的日志分析工具,您可以使用这些工具监控 Cloud Functions。与自定义日志记录结合使用时,这些工具的功能更为强大。

基于日志的指标

在 Cloud Logging 界面中,您可以使用高级过滤条件字段将日志范围缩小到要分析的函数,然后点击提交过滤条件以过滤日志。例如,您可以只分析来自某个函数的日志:

resource.type="cloud_function"
resource.labels.function_name="myCloudFunction"
resource.labels.region="us-central1"

如果您记录了具有自定义 JSON 负载的事件,则可以使用所提供的键和值进行过滤:

resource.type="cloud_function"
resource.labels.function_name="CustomMetrics"
jsonPayload.event="my-event"

过滤日志后,您可以使用基于日志的指标对其进行分析。点击创建指标按钮以打开指标编辑器,然后选择一类指标:

  • 计数器指标:用于计算与过滤条件匹配的日志条目的数量。例如,您可以计算某一特定事件发生的次数。
  • 分布指标:累积与过滤条件匹配的日志条目的数值数据。例如,您可以跟踪函数中特定操作的延迟时间。

对于基于文本的日志(例如通过函数中的 console.log() 生成的日志),您可以使用正则表达式从 textPayload 字段中提取值和标签。对于包含结构化数据的自定义日志,您可以直接访问 jsonPayload 字段中的数据。

图表和提醒

创建基于日志的指标以监控您的函数后,您可以根据这些指标创建图表和提醒。例如,您可以创建一个图表来直观呈现指定时间段内的延迟,或创建一个提醒来让您知道某个错误是否出现得过于频繁。

如需详细了解如何在图表和提醒政策中使用基于日志的指标,请参阅创建图表和提醒