Günlükleri yazma ve görüntüleme


Günlük kaydı, hata ayıklama ve kod izleme için önemli bir araçtır. Cloud Functions, aşağıdaki işlemler için logger SDK'sını kullanarak Düğüm.js veya Python gibi veya web için geliştirmede kullanılan console nesne standardı.

Cloud Logging ücretli bir hizmettir. şu durumlarda faturalandırılabilirsiniz: ücretsiz kullanım kotasını aştı. Daha fazla bilgi için bkz. Cloud Logging fiyatlandırması.

Günlük yazma

Cloud Functions günlük kaydı SDK'sını kullanma

Cloud Functions günlük kaydı SDK'sı, Cloud Logging'e aktarmanızı sağlar. Bu SDK'yı yapılandırılmış veri ile etkinlikleri günlüğe kaydetmek için kullanabilirsiniz. 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ı INFO günlük düzeyindedir.

  • logger.info() komutları INFO günlük düzeyindedir.

  • logger.warn() komutları WARNING günlük düzeyindedir.

  • logger.error() komutlarının günlük düzeyi ERROR'dur.

  • logger.debug() komutları DEBUG günlük düzeyindedir.

  • Dahili sistem mesajlarının günlük düzeyi HATA AYIKLAMA şeklindedir.

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. Burada bir fonksiyonun her günlük türünü nasıl kullanabileceğine ilişkin örnek:

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() kullanarak, önem düzeylerini günlüğe kaydetme CRITICAL, ALERT ve EMERGENCY. LogSeverity başlıklı makaleyi inceleyin.

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ı için önerilen çözüm, logger SDK'sını kullanmaktır. tercih edebilirsiniz. Node.js ile bunun yerine standart JavaScript günlük kaydını kullanabilirsiniz console.log ve console.error gibi aramalar yapabilirsiniz, ancak önce bir özel modülün düzgün çalışması için standart yöntemlere yama uygulayın:

require("firebase-functions/logger/compat");

Günlük kaydedici uyumluluk modülüne ihtiyaç duyduğunuzda, Kodunuzda normal şekilde console.log() yöntem:

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üzeyindedir.
  • console.info() komutları INFO günlük düzeyindedir.
  • console.warn() komutlarının günlük düzeyi ERROR'dur.
  • console.error() komutlarının günlük düzeyi ERROR'dur.
  • Dahili sistem mesajlarının günlük düzeyi HATA AYIKLAMA şeklindedir.

Günlükleri görüntüleme

Cloud Functions günlükleri Google Cloud konsolunuza Cloud Logging kullanıcı arayüzü veya firebase komut satırı aracı üzerinden kullanılabilir.

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 sağlayın:

firebase functions:log --only <FUNCTION_NAME>

Tüm günlük görüntüleme seçenekleri için functions:log yardımına bakın:

firebase help functions:log

Google Cloud Console'u kullanma

İşlevlerle ilgili günlükleri Google Cloud Console'da görüntüleyebilirsiniz.

Cloud Logging kullanıcı arayüzünü kullanma

Cloud Functions günlüklerini görüntüleyebilirsiniz Cloud Logging kullanıcı arayüzünde görebilirsiniz.

Günlükleri analiz etme

Cloud Logging, günlük performansınızda kullanabileceğiniz Cloud Functions'larınızı izlemek için kullanabileceğiniz çeşitli araçlar bulunur.

Grafikler ve uyarılar

İşlevlerinizi izlemek için günlük tabanlı metrikler oluşturduktan sonra grafikler ve uyarılar oluşturabilirsiniz. Örneğin, ekip üyeleri için Zaman içindeki gecikmeyi görselleştirmek için bir grafik oluşturabilir veya zaman içindeki gecikmeyi bir hata oluşur.

Nasıl yapılacağıyla ilgili ayrıntılı bilgi için Grafik ve Uyarı Oluşturma bölümüne bakın ve uyarı politikalarında günlük tabanlı metrikler kullanın.