Logs schreiben und aufrufen


Logging ist ein wichtiges Tool für das Debugging und das Monitoring von Code. Cloud Functions bietet Ihnen die Möglichkeit, das LOGger SDK für Node.js oder Python oder den Objektstandard console für die Entwicklung für das Web zu verwenden.

Cloud Logging ist ein kostenpflichtiger Dienst. Wenn Sie das kostenlose Kontingent überschreiten, können Ihnen Kosten in Rechnung gestellt werden. Weitere Informationen finden Sie unter Cloud Logging – Preise.

Logs schreiben

Cloud Functions-Logger-SDK verwenden

Das Protokollierungs-SDK Cloud Functions bietet eine Standardschnittstelle, um den Status von Funktionen an Cloud Logging zu melden. Mit diesem SDK können Sie Ereignisse mit strukturierten Daten erfassen, um Analysen und Monitoring zu vereinfachen.

Importieren Sie aus dem Teilpaket logger:

Node.js

// All available logging functions
const {
  log,
  info,
  debug,
  warn,
  error,
  write,
} = require("firebase-functions/logger");

Python

from firebase_functions import logger
  • logger.log()-Befehle haben die Logebene INFO.

  • logger.info()-Befehle haben die Logebene INFO.

  • logger.warn()-Befehle haben die Logebene WARNUNG.

  • logger.error()-Befehle haben die Logebene FEHLER.

  • logger.debug()-Befehle haben die Logebene DEBUG.

  • Interne Systemmeldungen haben die Logebene DEBUG.

In diesem Beispiel wird eine Funktion zum Schreiben eines einfachen Protokolls veranschaulicht:

Node.js

exports.helloWorld = onRequest((request, response) => {
  // sends a log to Cloud Logging
  log("Hello logs!");

  response.send("Hello from Firebase!");
});

Python

@https_fn.on_request()
def hello_world(req: https_fn.Request) -> https_fn.Response:
    # sends a log to Cloud Logging
    logger.log("Hello logs!")

    return https_fn.Response("Hello from Firebase!")

Verwenden Sie unterschiedliche Logebenen für verschiedene Logtypen in Ihrem Funktionscode. Strukturierte Daten können einem Log als letztes Argument angehängt werden. Hier ein Beispiel dafür, wie die einzelnen Protokolltypen in einer Funktion verwendet werden können:

Node.js

exports.getInspirationalQuote = onRequest(async (request, response) => {
  const db = getFirestore();
  const today = new Date();
  const quoteOfTheMonthRef = db
      .collection("quotes")
      .doc(`${today.getFullYear()}`)
      .collection("months")
      .doc(`${today.getMonth()}`);

  const DEFAULT_QUOTE =
      "You miss 100% of the shots you don't take. -Wayne Gretzky";
  let quote;
  try {
    const quoteOfTheMonthDocSnap = await quoteOfTheMonthRef.get();

    // Attach relevant debugging information with debug()
    debug("Monthly quote fetch result", {
      docRef: quoteOfTheMonthRef.path,
      exists: quoteOfTheMonthDocSnap.exists,
      createTime: quoteOfTheMonthDocSnap.createTime,
    });

    if (quoteOfTheMonthDocSnap.exists) {
      quote = quoteOfTheMonthDocSnap.data().text;
    } else {
      // Use warn() for lower-severity issues than error()
      warn("Quote not found for month, sending default instead", {
        docRef: quoteOfTheMonthRef.path,
        dateRequested: today.toLocaleDateString("en-US"),
      });

      quote = DEFAULT_QUOTE;
    }
  } catch (err) {
    // Attach an error object as the second argument
    error("Unable to read quote from Firestore, sending default instead",
        err);

    quote = DEFAULT_QUOTE;
  }

  // Attach relevant structured data to any log
  info("Sending a quote!", {quote: quote});
  response.json({inspirationalQuote: quote});
});

Python

@https_fn.on_request()
def get_inspirational_quote(req: https_fn.Request) -> https_fn.Response:
    firestore_client = firestore.client()
    today = datetime.date.today()
    quote_of_the_month_ref = (firestore_client.collection("quotes").doc(str(
        today.year)).collection("months").doc(str(today.month)))

    default_quote = "Python has been an important part of Google since the beginning, and remains so as the system grows and evolves."

    quote = None
    try:
        quote_of_the_month = quote_of_the_month_ref.get()

        # Attach relevant debugging information with debug()
        logger.debug(
            "Monthly quote fetch result",
            docRef=quote_of_the_month.path,
            exists=quote_of_the_month.exists,
            createTime=quote_of_the_month.createTime,
        )

        if quote_of_the_month.exists:
            quote = quote_of_the_month.to_dict()["text"]
        else:
            # Use warn() for lower-severity issues than error()
            logger.warn(
                "Quote not found for month, sending default instead",
                doc_reference=quote_of_the_month.path,
                date_requested=today.strftime("%Y-%m-%d"),
            )
            quote = default_quote
    except:
        e = sys.exc_info()[0]
        # Attach an error object as the second argument
        logger.error("Unable to read quote from Firestore, sending default instead", error=e)
        quote = default_quote

    # Attach relevant structured data to any log
    logger.info("Sending a quote!", quote=quote)
    return https_fn.Response("Hello from Firebase!")

Mit logger.write() können Sie Logeinträge mit den zusätzlichen Schweregraden CRITICAL, ALERT und EMERGENCY schreiben. Weitere Informationen finden Sie unter LogSeverity.

Node.js

exports.appHasARegression = onRegressionAlertPublished((event) => {
  write({
    // write() lets you set additional severity levels
    // beyond the built-in logger functions
    severity: "EMERGENCY",
    message: "Regression in production app",
    issue: event.data.payload.issue,
    lastOccurred: event.data.payload.resolveTime,
  });
});

Python

@crashlytics_fn.on_regression_alert_published()
def app_has_regression(alert: crashlytics_fn.CrashlyticsRegressionAlertEvent) -> None:
    logger.write(
        severity="EMERGENCY",
        message="Regression in production app",
        issue=alert.data.payload.issue,
        last_occurred=alert.data.payload.resolve_time,
    )
    print(alert)

console.log verwenden

Wir empfehlen, für das Logging aus einer Funktion das Logger SDK für Ihre Plattform zu verwenden. Mit Node.js können Sie stattdessen standardmäßige JavaScript-Loggingaufrufe wie console.log und console.error verwenden. Sie müssen jedoch zuerst ein spezielles Modul anfordern, um die Standardmethoden zu korrigieren, damit sie richtig funktionieren:

require("firebase-functions/logger/compat");

Sobald Sie das Logger-Kompatibilitätsmodul erforderlich gemacht haben, können Sie console.log()-Methoden wie gewohnt in Ihrem Code verwenden:

exports.helloError = functions.https.onRequest((request, response) => {
  console.log('I am a log entry!');
  response.send('Hello World...');
});
  • console.log()-Befehle haben die Logebene INFO.
  • console.info()-Befehle haben die Logebene INFO.
  • console.warn()-Befehle haben die Logebene ERROR.
  • console.error()-Befehle haben die Logebene FEHLER.
  • Interne Systemmeldungen haben die Logebene DEBUG (Fehlerbehebung).

Logs ansehen

Logs für Cloud Functions können entweder in der Google Cloud Console, in der Cloud Logging-Benutzeroberfläche oder über das firebase-Befehlszeilentool aufgerufen werden.

Mit der Firebase CLI

Wenn Sie Logs mit dem firebase-Tool aufrufen möchten, verwenden Sie den Befehl functions:log:

firebase functions:log

Wenn Sie Logs für eine bestimmte Funktion aufrufen möchten, geben Sie den Funktionsnamen als Argument an:

firebase functions:log --only <FUNCTION_NAME>

Informationen zu allen Loganzeigeoptionen finden Sie in der Hilfe zu functions:log:

firebase help functions:log

Google Cloud-Konsole verwenden

Sie können Logs für Funktionen in der Google Cloud Console aufrufen.

Cloud Logging-Benutzeroberfläche verwenden

Sie können sich Logs für Cloud Functions in der Cloud Logging-Benutzeroberfläche ansehen.

Logs analysieren

Cloud Logging bietet eine leistungsstarke Suite von Tools zur Protokollanalyse, mit denen Sie Ihre Cloud Functions im Blick behalten können.

Diagramme und Benachrichtigungen

Nachdem Sie logbasierte Messwerte zum Überwachen Ihrer Funktionen erstellt haben, können Sie auf der Grundlage dieser Messwerte Diagramme und Benachrichtigungen erstellen. Sie können beispielsweise ein Diagramm erstellen, um die Latenz im Zeitverlauf zu visualisieren, oder eine Benachrichtigung, die Sie informiert, wenn ein bestimmter Fehler zu oft auftritt.

Ausführliche Informationen zur Verwendung von logbasierten Messwerten in Diagrammen und Benachrichtigungsrichtlinien finden Sie unter Diagramme und Benachrichtigungen erstellen.