Günlük kaydı, kodda hata ayıklama ve kodu izleme için önemli bir araçtır.
Cloud Functions, Node.js veya Python için günlükçü 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 faturalandırılabilirsiniz. Daha fazla bilgi için Cloud Logging fiyatlandırması başlıklı makaleyi inceleyin.
Günlük yazma
Cloud Functions günlükçü SDK'sını kullanma
Cloud Functions günlükçü SDK'sı, işlevlerden Cloud Logging'e durum 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 aktarın:
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()komutlarının günlük düzeyi INFO'dur.logger.info()komutlarının günlük düzeyi INFO'dur.logger.warn()komutun günlük düzeyi WARNING.logger.error()komutlarında ERROR günlük kaydı düzeyi vardır.logger.debug()komutlarında DEBUG günlük düzeyi vardır.Dahili sistem mesajları DEBUG günlük düzeyine sahiptir.
Bu örnekte, temel bir günlük yazan bir işlev gösterilmektedir:
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!")
İş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üğe eklenebilir. Bir işlevin her günlük türünü nasıl kullanabileceğine dair bir örneği aşağıda bulabilirsiniz:
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!")
logger.write() ile CRITICAL, ALERT ve EMERGENCY gibi ek günlük önem derecesi seviyelerine sahip günlük girişleri yazabilirsiniz. LogSeverity bölümüne bakın.
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 uygulamasını kullanma
Bir işlevden günlük kaydı yapmak için platformunuzun günlükçü SDK'sını kullanmanız önerilir. Node.js ile console.log ve console.error gibi standart JavaScript günlük kaydı çağrılarını kullanabilirsiniz ancak öncelikle standart yöntemlerin doğru şekilde çalışması için özel bir modül gereklidir:
require("firebase-functions/logger/compat");
Günlükçü uyumluluk modülünü zorunlu kıldıktan sonra kodunuzda console.log() yöntemlerini normal şekilde kullanabilirsiniz:
exports.helloError = functions.https.onRequest((request, response) => {
console.log('I am a log entry!');
response.send('Hello World...');
});
console.log()komutlarının günlük düzeyi INFO'dur.console.info()komutlarının günlük düzeyi INFO'dur.console.warn()komutun günlük düzeyi ERROR.console.error()komutlarında ERROR günlük kaydı düzeyi vardır.- 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ı aracılığıyla görüntülenebilir.
Firebase CLI'yı kullanma
firebase aracıyla günlükleri 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 belirtin:
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 için günlükleri görüntüleyebilirsiniz.
Günlükleri analiz etme
Cloud Logging, Cloud Functions hizmetinizi izlemek için kullanabileceğiniz güçlü bir günlük analizi araçları paketi sunar.
Grafikler ve uyarılar
İşlevlerinizi izlemek için günlüğe dayalı metrikler oluşturduktan sonra bu metrikleri temel alan grafikler ve uyarılar oluşturabilirsiniz. Örneğin, gecikmeyi zaman içinde görselleştirmek için bir grafik oluşturabilir veya belirli bir hata çok sık meydana gelirse sizi bilgilendirecek bir uyarı oluşturabilirsiniz.
Günlük tabanlı metriklerin grafiklerde ve uyarı politikalarında nasıl kullanılacağı hakkında ayrıntılı bilgi için Grafik ve Uyarı Oluşturma başlıklı makaleyi inceleyin.
Yürütme kimliklerini anlama ve kullanma
Varsayılan olarak Cloud Run Functions (2. nesil), 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ışabileceği ve tek bir yürütmenin akışını takip etmeyi zorlaştırabileceği anlamına gelir.
Bu konuda yardımcı olmak için Firebase CLI 13.33.0 ve sonraki sürümler kullanılarak dağıtılan işlevler, otomatik olarak her günlük girişini ilgili yürütme kimliğiyle ilişkilendirme seçeneğiyle 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 yapmanız 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 ortam değişkenini LOG_EXECUTION_ID 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.
İşlevinizden günlük girişini genişletin. Yürütme kimliği, yapılandırılmış günlük verilerinde, etiketlerin altında
labels.execution_idolarak iç içe yerleştirilmiştir.execution_iddeğerini tıklayın ve açılır menüden "Eşleşen girişleri göster"i seçerek aynı işlev yürütmeyle ilişkili diğer tüm günlükleri görüntüleyin.
İşleviniz aynı anda birden fazla isteği işliyor olsa bile yürütme kimliğini kullanarak tek bir istekle ilgili tüm günlük mesajlarını gruplandırabilirsiniz.
Özel özet alanlarıyla 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ı][cloud-logging-preference] olarak ekleyebilirsiniz. Yürütme kimliğini özet alanı olarak ekledikten sonra her günlük girişinde, günlük satırının başında yürütme kimliği çip olarak gösterilir. Bu, 1. nesil işlevlerin tüm günlük girişleri için yürütme kimliğini gösterme şekline benzer.
Yürütme kimliğini özet alanına eklemek için:
labels.execution_idaltı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.
Her günlük girişinde artık özet alanında executionId belirgin bir şekilde 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.