گزارش ها را بنویسید و مشاهده کنید

ورود به سیستم ابزاری مهم برای اشکال زدایی و کد نظارت است. Cloud Functions گزینه استفاده از Logger SDK را برای Node.js یا Python یا استاندارد شیء console برای توسعه برای وب به شما می دهد.

Cloud Logging یک سرویس قابل شارژ است. در صورت تجاوز از سهمیه بدون هزینه ممکن است صورتحساب دریافت کنید. برای اطلاعات بیشتر ، به قیمت گذاری ورود به سیستم Cloud مراجعه کنید.

نوشتن گزارش

با استفاده از Cloud Functions Logger SDK

Cloud Functions Logger SDK یک رابط استاندارد برای گزارش وضعیت از توابع به ورود به ابر فراهم می کند. می‌توانید از این SDK برای ثبت رویدادها با داده‌های ساختاریافته استفاده کنید، که امکان تجزیه و تحلیل و نظارت آسان‌تر را فراهم می‌کند.

واردات از زیر بسته logger :

Node.js

// All available logging functions
const {
  log,
  info,
  debug,
  warn,
  error,
  write,
} = require("firebase-functions/logger");

پایتون

from firebase_functions import logger
  • دستورات logger.log() دارای سطح گزارش INFO هستند.

  • دستورات logger.info() دارای سطح گزارش INFO هستند.

  • دستورات logger.warn() سطح ورود به سیستم هشدار دهنده را دارند.

  • دستورات logger.error() سطح ورود به سیستم را دارند.

  • دستورات logger.debug() سطح ورود به سیستم اشکال زدایی را دارند.

  • پیام های سیستم داخلی دارای سطح گزارش DEBUG هستند.

این مثال تابعی را نشان می دهد که یک ورود به سیستم اساسی را می نویسد:

Node.js

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!")

از سطوح مختلف گزارش برای انواع مختلف ورود در کد تابع خود استفاده کنید. داده های ساخت یافته را می توان به عنوان آخرین آرگومان به گزارش پیوست کرد. در اینجا مثالی از نحوه استفاده یک تابع از هر نوع گزارش آورده شده است:

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});
});

پایتون

@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() می توانید ورودی های گزارش را با سطوح شدت گزارش اضافی CRITICAL ، ALERT و EMERGENCY بنویسید. 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,
  });
});

پایتون

@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

راه حل پیشنهادی برای ورود به سیستم از یک عملکرد استفاده از Logger SDK برای سیستم عامل خود است. با Node.js ، در عوض می توانید از تماس های استاندارد ورود به سیستم JavaScript مانند console.log و console.error استفاده کنید ، اما ابتدا برای پچ کردن روشهای استاندارد برای کار درستی به یک ماژول ویژه نیاز دارید:

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

پس از نیاز به ماژول سازگاری Logger ، می توانید از روش های console.log() به صورت عادی در کد خود استفاده کنید:

exports.helloError = functions.https.onRequest((request, response) => {
  console.log('I am a log entry!');
  response.send('Hello World...');
});
  • دستورات console.log() دارای سطح گزارش INFO هستند.
  • دستورات console.info() دارای سطح گزارش INFO هستند.
  • دستورات console.warn() دارای سطح log ERROR هستند.
  • دستورات console.error() دارای سطح log ERROR هستند.
  • پیام های سیستم داخلی دارای سطح گزارش DEBUG هستند.

مشاهده گزارش‌ها

گزارش‌های مربوط به Cloud Functions یا در کنسول Google Cloud ، رابط کاربری Cloud Logging یا از طریق ابزار خط فرمان firebase قابل مشاهده هستند.

با استفاده از Firebase CLI

برای مشاهده سیاهههای مربوط به ابزار firebase ، از functions:log :

firebase functions:log

برای مشاهده گزارش‌های یک تابع خاص، نام تابع را به عنوان آرگومان ارائه کنید:

firebase functions:log --only <FUNCTION_NAME>

برای طیف کاملی از گزینه‌های مشاهده گزارش، راهنمای functions:log :

firebase help functions:log

با استفاده از کنسول Google Cloud

می‌توانید گزارش‌های مربوط به عملکردها را در کنسول Google Cloud مشاهده کنید.

با استفاده از رابط کاربری Cloud Logging

می‌توانید گزارش‌های مربوط به Cloud Functions در رابط کاربری Cloud Logging مشاهده کنید.

تجزیه و تحلیل لاگ ها

Cloud Logging مجموعه قدرتمندی از ابزارهای تجزیه و تحلیل گزارش ها را ارائه می دهد که می توانید از آنها برای نظارت بر Cloud Functions خود استفاده کنید.

نمودارها و هشدارها

هنگامی که معیارهای مبتنی بر گزارش را برای نظارت بر عملکردهای خود ایجاد کردید، می توانید نمودارها و هشدارها را بر اساس این معیارها ایجاد کنید. به عنوان مثال، می‌توانید نموداری برای تجسم تأخیر در طول زمان ایجاد کنید، یا یک هشدار ایجاد کنید تا در صورت بروز خطای خاصی به شما اطلاع دهد.

برای اطلاعات دقیق در مورد نحوه استفاده از معیارهای مبتنی بر گزارش در نمودارها و خط‌مشی‌های هشدار ، به ایجاد نمودارها و هشدارها مراجعه کنید.

شناسه های اجرایی را درک کرده و از آنها استفاده کنید

به طور پیش‌فرض، توابع Cloud Run (نسل دوم) از اجرای همزمان چندین درخواست در یک نمونه تابع پشتیبانی می‌کند. این به این معنی است که گزارش‌های درخواست‌های مختلف می‌توانند به هم متصل شوند و پیگیری جریان یک اجرا را سخت‌تر می‌کند.

برای کمک به این امر ، توابع مستقر شده با استفاده از Firebase CLI نسخه 13.33.0 و بعداً به طور خودکار با گزینه ای برای ارتباط یک شناسه اجرای با هر ورود به سیستم منتشر شده در هنگام انجام آن اجرا مستقر می شوند.

شناسه اجرا به طور منحصربه‌فرد همه گزارش‌های مرتبط با یک درخواست واحد را که توسط تابع شما مدیریت می‌شود، شناسایی می‌کند. هیچ تغییری در کد مورد نیاز نیست. شناسه اجرا به طور خودکار به گزارش های شما اضافه می شود.

برای غیرفعال کردن شناسه اجرای لاگ در ورودی های گزارش خود، متغیر محیطی LOG_EXECUTION_ID در فایل dotenv خود روی false قرار دهید.

لاگ ها را با شناسه اجرا پیدا کنید و به هم مرتبط کنید

می‌توانید گزارش‌ها را با شناسه اجرا در Cloud Logs Explorer بررسی و مرتبط کنید.

  1. ورودی گزارش را از تابع خود گسترش دهید. شناسه اجرا در داخل داده‌های گزارش ساختار یافته قرار دارد که در زیر برچسب‌ها به‌عنوان labels.execution_id تو در تو قرار دارد.

  2. بر روی مقدار execution_id کلیک کنید و "نمایش ورودی های تطبیق" را از منوی کشویی انتخاب کنید تا تمام سیاهههای دیگر مرتبط با همان اجرای عملکرد را ببینید.

با استفاده از شناسه اجرای ، می توانید تمام پیام های ورود به سیستم مربوط به یک درخواست واحد را با هم گروه بندی کنید ، حتی اگر عملکرد شما به طور همزمان درخواست های مختلف را انجام دهد.

قابلیت مشاهده گزارش را با فیلدهای خلاصه سفارشی افزایش دهید

برای اینکه شناسه اجرا به راحتی در Logs Explorer قابل مشاهده باشد، می توانید آن را به عنوان [فیلد خلاصه سفارشی][cloud-logging-preference] اضافه کنید. پس از اضافه کردن شناسه اجرا به عنوان یک فیلد خلاصه، هر ورودی گزارش، شناسه اجرا را به عنوان یک تراشه در ابتدای خط گزارش نشان می دهد. مشابه روشی که توابع نسل اول شناسه اجرایی را برای همه ورودی‌های گزارش نشان می‌دهند.

برای افزودن شناسه اجرا به فیلد خلاصه:

  1. روی مقدار شناسه اجرا در ورودی گزارش ساختاریافته در زیر labels.execution_id کلیک کنید.

  2. از منوی کشویی "افزودن فیلد به خط خلاصه" را انتخاب کنید.

هر ورودی ورود به سیستم اکنون executionId به طور برجسته در قسمت خلاصه نمایش می دهد ، و شناسایی و گروه های مرتبط با یک شناسه اجرای خاص را آسان تر می کند.