Il logging è uno strumento importante per il debug e il monitoraggio del codice.
Cloud Functions ti offre la possibilità di utilizzare l'SDK di log per
Node.js
o Python oppure lo standard di oggetti console
per lo sviluppo per il web.
Cloud Logging è un servizio a pagamento; ti potrebbe essere addebitato un costo se superi la quota senza costi. Per ulteriori informazioni, consulta Prezzi di Cloud Logging.
Scrittura dei log
Utilizzo dell'SDK logger Cloud Functions
L'SDK logger Cloud Functions fornisce un'interfaccia standard per segnalare lo stato dalle 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");
Python
from firebase_functions import logger
I comandi
logger.log()
hanno il livello di log INFO.I comandi
logger.info()
hanno il livello di log INFO.I comandi
logger.warn()
hanno il livello di log WARNING.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 log DEBUG.
Questo esempio mostra una funzione che scrive un log di base:
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!")
Utilizza livelli di log diversi per tipi di log diversi nel codice della 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 log:
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!")
Con logger.write()
, puoi scrivere voci di log con livelli di gravità aggiuntivi di CRITICAL
, ALERT
e 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,
});
});
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)
Uso: console.log
La soluzione consigliata per il logging da una funzione è utilizzare l'SDK del logger per la tua piattaforma. Con Node.js, puoi utilizzare chiamate di logging JavaScript standard come console.log
e console.error
, ma devi prima richiedere un modulo speciale per applicare le patch ai metodi standard affinché funzionino correttamente:
require("firebase-functions/logger/compat");
Dopo aver richiesto il modulo di compatibilità del logger, puoi utilizzare i metodi console.log()
come di consueto nel 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 log INFO. - I comandi
console.info()
hanno il livello di log INFO. - I comandi
console.warn()
hanno il livello di log ERROR. - I comandi
console.error()
hanno il livello di log ERROR. - I messaggi di sistema interni hanno il livello di log DEBUG.
Visualizzazione dei log
I log di Cloud Functions sono visualizzabili nella
console Google Cloud,
nell'interfaccia utente di Cloud Logging o tramite lo strumento a riga di comando firebase
.
Utilizzo dell'interfaccia a riga di comando di Firebase
Per visualizzare i log con lo strumento firebase
, usa il comando functions:log
:
firebase functions:log
Per visualizzare i log di una funzione specifica, fornisci il nome della funzione come argomento:
firebase functions:log --only <FUNCTION_NAME>
Per la gamma completa delle opzioni di visualizzazione dei log, consulta la guida di functions:log
:
firebase help functions:log
Utilizzo della console Google Cloud
Puoi visualizzare i log delle funzioni nella console Google Cloud.
Utilizzo dell'interfaccia utente di Cloud Logging
Puoi visualizzare i log di 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 Cloud Functions.
Grafici e avvisi
Dopo aver creato metriche basate su log per monitorare le funzioni, puoi creare grafici e avvisi in base a queste metriche. Ad esempio, puoi creare un grafico per visualizzare la latenza nel tempo o un avviso che ti indichi se si verifica un determinato errore troppo spesso.
Consulta Creare grafici e avvisi per informazioni dettagliate su come utilizzare le metriche basate su log nei grafici e nei criteri di avviso.