Protokolle schreiben und anzeigen


Die Protokollierung ist ein wichtiges Tool zum Debuggen und Überwachen von Code. Cloud Functions bietet Ihnen die Möglichkeit, das Logger-SDK für Node.js oder Python oder den console für die Entwicklung für das Web zu verwenden.

Cloud Logging ist ein kostenpflichtiger Dienst; Es kann sein, dass Ihnen eine Rechnung in Rechnung gestellt wird, wenn Sie das kostenlose Kontingent überschreiten. Weitere Informationen finden Sie unter Cloud Logging-Preise .

Protokolle schreiben

Verwenden des Cloud Functions-Logger-SDK

Das Cloud Functions-Logger-SDK bietet eine Standardschnittstelle zum Melden des Status von Funktionen an Cloud Logging. Mit diesem SDK können Sie Ereignisse mit strukturierten Daten protokollieren und so eine einfachere Analyse und Überwachung ermöglichen.

Import aus dem logger Unterpaket:

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 Protokollebene INFO .

  • logger.info() Befehle haben die Protokollebene INFO .

  • logger.warn() -Befehle haben die Protokollebene WARNING .

  • logger.error() Befehle haben die Protokollebene ERROR .

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

  • Interne Systemmeldungen haben die Protokollstufe DEBUG .

Dieses Beispiel zeigt eine Funktion, die ein einfaches Protokoll schreibt:

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 in Ihrem Funktionscode unterschiedliche Protokollebenen für unterschiedliche Protokolltypen. Strukturierte Daten können als letztes Argument an ein Protokoll angehängt werden. Hier ist ein Beispiel dafür, wie eine Funktion jeden Protokolltyp verwenden kann:

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 Protokolleinträge mit den zusätzlichen Protokollschweregraden CRITICAL , ALERT und EMERGENCY schreiben. Siehe 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)

Verwenden von console.log

Die empfohlene Lösung für die Protokollierung einer Funktion ist die Verwendung des Logger-SDK für Ihre Plattform. Mit Node.js können Sie stattdessen Standard-JavaScript-Protokollierungsaufrufe wie console.log und console.error verwenden. Sie benötigen jedoch zunächst ein spezielles Modul, um die Standardmethoden zu patchen, damit sie ordnungsgemäß funktionieren:

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

Sobald Sie das Logger-Kompatibilitätsmodul benötigt haben, können Sie die Methoden console.log() 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 Protokollebene INFO .
  • console.info() -Befehle haben die Protokollebene INFO .
  • console.warn() -Befehle haben die Protokollebene ERROR .
  • console.error() Befehle haben die Protokollebene ERROR .
  • Interne Systemmeldungen haben die Protokollebene DEBUG .

Protokolle ansehen

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

Verwenden der Firebase-CLI

Um Protokolle mit dem firebase Tool anzuzeigen, verwenden Sie den Befehl functions:log :

firebase functions:log

Um Protokolle für eine bestimmte Funktion anzuzeigen, geben Sie den Funktionsnamen als Argument an:

firebase functions:log --only <FUNCTION_NAME>

Den gesamten Umfang der Protokollanzeigeoptionen finden Sie in der Hilfe zu functions:log :

firebase help functions:log

Verwendung der Google Cloud-Konsole

Sie können Protokolle für Funktionen in der Google Cloud Console anzeigen.

Verwenden der Cloud Logging-Benutzeroberfläche

Sie können Protokolle für Cloud Functions in der Cloud Logging-Benutzeroberfläche anzeigen .

Protokolle analysieren

Cloud Logging bietet eine leistungsstarke Suite von Protokollanalysetools, mit denen Sie Ihre Cloud-Funktionen überwachen können.

Diagramme und Warnungen

Sobald Sie protokollbasierte Metriken zur Überwachung Ihrer Funktionen erstellt haben, können Sie Diagramme und Warnungen basierend auf diesen Metriken erstellen. Sie könnten beispielsweise ein Diagramm erstellen, um die Latenz im Zeitverlauf zu visualisieren, oder eine Warnung erstellen, um Sie darüber zu informieren, wenn ein bestimmter Fehler zu häufig auftritt.

Ausführliche Informationen zur Verwendung protokollbasierter Metriken in Diagrammen und Warnungsrichtlinien finden Sie unter Erstellen von Diagrammen und Warnungen.