Scrittura e visualizzazione dei log


La registrazione è uno strumento importante per il debug e il monitoraggio del codice. Cloud Functions ti offre la possibilità di utilizzare l'SDK del logger per Node.js o Python oppure l'oggetto console standard per lo sviluppo per il Web.

Cloud Logging è un servizio a pagamento; potresti ricevere un addebito se superi la quota gratuita. Per ulteriori informazioni, consulta Prezzi di Cloud Logging .

Scrivere log

Utilizzando l'SDK del logger Cloud Functions

L'SDK del logger Cloud Functions fornisce un'interfaccia standard per segnalare lo stato delle funzioni a Cloud Logging. Puoi utilizzare questo SDK per registrare eventi con dati strutturati , consentendo un'analisi e un monitoraggio più semplici.

Importa dal sottopacchetto logger :

Node.js

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

Pitone

from firebase_functions import logger
  • I comandi logger.log() hanno il livello di registro INFO .

  • I comandi logger.info() hanno il livello di registro INFO .

  • I comandi logger.warn() hanno il livello di registro ATTENZIONE .

  • I comandi logger.error() hanno il livello di log ERROR .

  • I comandi logger.debug() hanno il livello di log DEBUG .

  • I messaggi di sistema interni hanno il livello di registro DEBUG .

Questo esempio dimostra una funzione che scrive un registro di base:

Node.js

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

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

Pitone

@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!")

Utilizza livelli di log diversi per tipi diversi di log nel codice funzione. I dati strutturati possono essere allegati a un log come ultimo argomento. Ecco un esempio di come una funzione può utilizzare ciascun tipo di registro:

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});
});

Pitone

@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!")

Con logger.write() , puoi scrivere voci di log con livelli di gravità di log aggiuntivi di CRITICAL , ALERT ed EMERGENCY . Vedi 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,
  });
});

Pitone

@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)

Utilizzando console.log

La soluzione consigliata per l'accesso da una funzione è utilizzare l'SDK del logger per la tua piattaforma. Con Node.js, puoi invece utilizzare chiamate di registrazione JavaScript standard come console.log e console.error , ma devi prima richiedere un modulo speciale per applicare patch ai metodi standard affinché funzionino correttamente:

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

Una volta richiesto il modulo di compatibilità del logger, puoi utilizzare i metodi console.log() normalmente nel tuo codice:

exports.helloError = functions.https.onRequest((request, response) => {
  console.log('I am a log entry!');
  response.send('Hello World...');
});
  • I comandi console.log() hanno il livello di registro INFO .
  • I comandi console.info() hanno il livello di registro INFO .
  • I comandi console.warn() hanno il livello di registro ERROR .
  • I comandi console.error() hanno il livello di registro ERROR .
  • I messaggi di sistema interni hanno il livello di registro DEBUG .

Visualizzazione dei registri

I log per Cloud Functions sono visualizzabili nella console Google Cloud , nell'interfaccia utente di Cloud Logging o tramite lo strumento a riga di comando firebase .

Utilizzando la CLI di Firebase

Per visualizzare i log con lo strumento firebase , utilizza il comando functions:log :

firebase functions:log

Per visualizzare i log per una funzione specifica, fornire il nome della funzione come argomento:

firebase functions:log --only <FUNCTION_NAME>

Per la gamma completa di opzioni di visualizzazione del registro, visualizza la guida functions:log :

firebase help functions:log

Utilizzando la console Google Cloud

Puoi visualizzare i log delle funzioni nella console Google Cloud .

Utilizzando l'interfaccia utente di Cloud Logging

Puoi visualizzare i log per Cloud Functions nell'interfaccia utente di Cloud Logging.

Analisi dei log

Cloud Logging offre una potente suite di strumenti di analisi dei log che puoi utilizzare per monitorare le tue Cloud Functions.

Grafici e avvisi

Dopo aver creato metriche basate su log per monitorare le tue funzioni, puoi creare grafici e avvisi basati su queste metriche. Ad esempio, potresti creare un grafico per visualizzare la latenza nel tempo o creare un avviso per farti sapere se un determinato errore si verifica troppo spesso.

Consulta Creazione di grafici e avvisi per informazioni dettagliate su come utilizzare le metriche basate su log nei grafici e nei criteri di avviso.