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.