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.