Günlük kaydı, kodda hata ayıklama ve izleme için önemli bir araçtır.
Cloud Functions, Node.js veya Python için günlük kaydı SDK'sını ya da web için geliştirme yaparken console
nesne standardını kullanma seçeneği sunar.
Cloud Logging ücretli bir hizmettir. Ücretsiz kotayı aşarsanız sizden ücret alınabilir. Daha fazla bilgi için Cloud Logging fiyatlandırması bölümünü inceleyin.
Günlük yazma
Cloud Functions günlük kaydı SDK'sını kullanma
Cloud Functions günlükleyici SDK'sı, işlevlerdeki durumu Cloud Logging'e bildirmek için standart bir arayüz sağlar. Bu SDK'yı kullanarak etkinlikleri yapılandırılmış verilerle günlüğe kaydedebilir, böylece daha kolay analiz ve izleme yapabilirsiniz.
logger
alt paketinden içe aktarma:
// All available logging functions
const {
log,
info,
debug,
warn,
error,
write,
} = require("firebase-functions/logger");
from firebase_functions import logger
logger.log()
komutları INFO günlük düzeyine sahiptir.logger.info()
komutları INFO günlük düzeyine sahiptir.logger.warn()
komutları UYARI günlük düzeyine sahiptir.logger.error()
komutları ERROR günlük düzeyine sahiptir.logger.debug()
komutları DEBUG günlük düzeyine sahiptir.Dahili sistem mesajları DEBUG günlük düzeyine sahiptir.
Bu örnekte, temel bir günlük yazan bir işlev gösterilmektedir:
exports.helloWorld = onRequest((request, response) => {
// sends a log to Cloud Logging
log("Hello logs!");
response.send("Hello from Firebase!");
});
@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!")
İşlev kodunuzda farklı günlük türleri için farklı günlük düzeyleri kullanın. Yapılandırılmış veriler, son bağımsız değişken olarak bir günlüke eklenebilir. Bir işlevin her günlük türünü nasıl kullanabileceğine dair bir örnek aşağıda verilmiştir:
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});
});
@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!")
logger.write()
ile CRITICAL
, ALERT
ve EMERGENCY
ek günlük önem düzeyleriyle günlük girişleri yazabilirsiniz. LogSeverity konusuna bakın.
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,
});
});
@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
uygulamasını kullanma
Bir işlevden günlük kaydı almak için önerilen çözüm, platformunuz için günlük kaydı SDK'sını kullanmaktır. Node.js'de bunun yerine console.log
ve console.error
gibi standart JavaScript günlük kaydı çağrılarını kullanabilirsiniz. Ancak standart yöntemlerin doğru şekilde çalışması için önce özel bir modül kullanarak bu yöntemlere yama uygulamanız gerekir:
require("firebase-functions/logger/compat");
Günlük kaydı uyumluluk modülünü zorunlu kıldıysanız console.log()
yöntemlerini kodunuzda normal şekilde kullanabilirsiniz:
exports.helloError = functions.https.onRequest((request, response) => {
console.log('I am a log entry!');
response.send('Hello World...');
});
console.log()
komutları INFO günlük düzeyine sahiptir.console.info()
komutları INFO günlük düzeyine sahiptir.console.warn()
komutları ERROR günlük düzeyine sahiptir.console.error()
komutları ERROR günlük düzeyine sahiptir.- Dahili sistem mesajları DEBUG günlük düzeyine sahiptir.
Günlükleri görüntüleme
Cloud Functions günlükleri Google Cloud konsolunda, Cloud Logging kullanıcı arayüzünde veya firebase
komut satırı aracında görüntülenebilir.
Firebase CLI'yı kullanma
Günlükleri firebase
aracıyla görüntülemek için functions:log
komutunu kullanın:
firebase functions:log
Belirli bir işlevin günlüklerini görüntülemek için işlev adını bağımsız değişken olarak sağlayın:
firebase functions:log --only <FUNCTION_NAME>
Günlük görüntüleme seçeneklerinin tamamı için functions:log
ile ilgili yardım sayfasını inceleyin:
firebase help functions:log
Google Cloud konsolunu kullanma
İşlevlerin günlüklerini Google Cloud konsolunda görüntüleyebilirsiniz.
Cloud Logging kullanıcı arayüzünü kullanma
Cloud Logging kullanıcı arayüzünde Cloud Functions ile ilgili günlükleri görüntüleyebilirsiniz.
Günlükleri analiz etme
Cloud Logging, Cloud Functions'inizi izlemek için kullanabileceğiniz güçlü bir günlük analizi araç paketi sunar.
Grafikler ve uyarılar
İşlevlerinizi izlemek için günlük tabanlı metrikler oluşturduktan sonra bu metriklere göre grafikler ve uyarılar oluşturabilirsiniz. Örneğin, gecikmeyi zaman içinde görselleştirmek için bir grafik oluşturabilir veya belirli bir hatanın çok sık gerçekleşip gerçekleşmediğini bildiren bir uyarı oluşturabilirsiniz.
Günlük tabanlı metrikleri grafiklerde ve uyarı politikalarında kullanma hakkında ayrıntılı bilgi için Grafik ve Uyarı Oluşturma başlıklı makaleye bakın.
Yürütme kimliklerini anlama ve kullanma
Cloud Run işlevleri (2. nesil), varsayılan olarak tek bir işlev örneğinde birden fazla isteğin eşzamanlı olarak yürütülmesini destekler. Bu, farklı isteklerden gelen günlüklerin birbirine karıştırılabileceği anlamına gelir. Bu da tek bir yürütmenin akışını takip etmeyi zorlaştırır.
Bu konuda yardımcı olmak için Firebase CLI 13.33.0 sürümü ve sonraki sürümler kullanılarak dağıtılan işlevler, yürütme işleminin işlenmesi sırasında yayınlanan her günlük girişiyle bir yürütme kimliği ilişkilendirme seçeneğiyle otomatik olarak dağıtılır.
Yürütme kimliği, işleviniz tarafından işlenen tek bir istekle ilişkili tüm günlükleri benzersiz şekilde tanımlar. Kod değişikliği gerekmez. Yürütme kimliği, günlüklerinize otomatik olarak eklenir.
Günlük girişlerinizde yürütme kimliğinin günlüğe kaydedilmesini devre dışı bırakmak için dotenv dosyanızda LOG_EXECUTION_ID
ortam değişkenini false olarak ayarlayın.
Günlükleri yürütme kimliğine göre bulma ve ilişkilendirme
Cloud Günlük Gezgini'nde günlükleri yürütme kimliğine göre inceleyebilir ve ilişkilendirebilirsiniz.
İşlevinizdeki günlük girişini genişletin. Yürütme kimliği, yapılandırılmış günlük verilerinde bulunur ve etiketlerin altına
labels.execution_id
olarak yerleştirilir.Aynı işlev yürütmeyle ilişkili diğer tüm günlükleri görmek için
execution_id
değerini tıklayın ve açılır menüden "Eşleşen girişleri göster"i seçin.
İşleviniz eşzamanlı olarak birden fazla isteği işlese bile yürütme kimliğini kullanarak tek bir istekte bulunan tüm günlük mesajlarını gruplandırabilirsiniz.
Özel özet alanları ile günlük görünürlüğünü artırma
Yürütme kimliğini Günlük Gezgini'nde daha kolay görünür hale getirmek için özel özet alanı olarak ekleyebilirsiniz. Bu, 1. nesil işlevlerin tüm günlük girişleri için yürütme kimliğini gösterme şekline benzer şekilde, yürütme kimliğini her günlük girişi satırının başında bir çip olarak gösterir.
Özet alanına yürütme kimliği eklemek için:
labels.execution_id
altındaki yapılandırılmış günlük girişinde yürütme kimliğinin değerini tıklayın.Açılır menüden "Özet satırına alan ekle"yi seçin.
Artık her günlük girişinde özet alanında belirgin bir şekilde executionId
gösteriliyor. Bu sayede, belirli bir yürütme kimliğiyle ilişkili günlükleri tanımlamak ve gruplandırmak daha kolay hale geliyor.