Remote Logging — ما هو، أدوات التجميع وطرق التحليل عن بُعد للسجلات

المؤلف: IT Sectr نُشر: 2026-05-28 وقت القراءة: 8 دق

Remote Logging هو آلية لإرسال السجلات من جهاز محمول إلى خادم عن بُعد للتحليل والمراقبة المركزية. على عكس التسجيل المحلي الذي يخزن البيانات على الجهاز، يتيح التجميع عن بُعد رؤية الأخطاء والظروف الشاذة من جميع أجهزة المستخدمين في الوقت الفعلي. وفقًا لـ Sentry Resource Library، فإن التطبيقات التي تستخدم remote logging تكتشف 92% من أخطاء الإنتاج خلال الساعة الأولى بعد الإصدار مقارنة بـ 15% عند استخدام تقارير الأعطال فقط. هذه أداة إلزامية لأي فريق تطوير محمول: Firebase Crashlytics وSentry وDatadog توفر SDKs جاهزة لنظامي iOS وAndroid.

الملخص

  • Remote Logging — إرسال السجلات من جهاز إلى خادم للمراقبة المركزية وتحليل أخطاء الإنتاج
  • Firebase Crashlytics — خدمة مجانية من Google لجمع الأعطال والسجلات المخصصة على Android وiOS
  • Sentry — منصة لمراقبة الأخطاء مع دعم breadcrumbs وسياق المستخدم والتتبع الموزع
  • Logcat — نظام التسجيل القياسي لنظام Android، يمكن الوصول إليه عن بُعد عبر ADB وAndroid Studio
  • التجميع (Batching) — تجميع السجلات على الجهاز وإرسالها دفعات لتوفير البطارية وحركة المرور

ما هو Remote Logging

Remote Logging هو عملية جمع السجلات من الأجهزة عن بُعد وإرسالها إلى خادم مركزي للتحليل. في سياق التطوير المحمول، يشمل remote logging ليس فقط تقارير الأعطال ولكن أيضًا الأحداث المخصصة وbreadcrumbs ومقاييس الأداء وسيناريوهات المستخدم.

الفرق الرئيسي بين remote logging وcrash reporting هو الاستباقية. Crash reporting يجمع فقط بيانات عن أعطال التطبيق التي حدثت بالفعل. Remote logging يجمع تسلسل الأحداث قبل العطل: أي الشاشات فتحها المستخدم، وما هي الطلبات التي أرسلها، وما هي البيانات التي أدخلها. هذا يتيح إعادة إنتاج سيناريو الخطأ دون التواصل مع المستخدم.

Apple توفر آلية مدمجة للتجميع عن بُعد للسجلات عبر .logarchive، ولكن لتطبيقات الإنتاج تُستخدم دائمًا خدمات الطرف الثالث. يتضمن Android SDK Logcat، والذي يمكن الوصول إليه عن بُعد عبر ADB، ولكن ليس لأجهزة المستخدمين النهائيين دون وضع التصحيح.

هندسة التجميع عن بُعد للسجلات

تتكون هندسة remote logging من ثلاثة مكونات: SDK العميل على الجهاز الذي يجمع السجلات ويخزنها مؤقتًا، بروتوكول النقل لإرسال البيانات، والخادم للتخزين والعرض.

المكونالدورأمثلة
SDK العميلالتجميع والتخزين المؤقت والتجميع (batching)Firebase SDK, Sentry Cocoa, Timber
النقلنقل البيانات عبر HTTPSREST, gRPC, WebSocket
الخادمالتخزين والفهرسة والتنبيهاتSentry, Crashlytics, Datadog

يقوم SDK العميل بتخزين السجلات مؤقتًا في RAM ويُفرغها بشكل دوري إلى الخادم على دفعات. إذا كان الجهاز غير متصل، تُحفظ السجلات في ملف محلي وتُرسل عند الاتصال التالي بالشبكة. حجم المخزن المؤقت وفاصل الإرسال قابلان للتكوين: القيم النموذجية هي 50 حدثًا أو 30 ثانية.

بروتوكولات النقل

HTTPS REST هو البروتوكول الأكثر شيوعًا لـ remote logging. يقوم SDK بتسلسل السجلات إلى JSON وإرسالها عبر طلبات POST إلى نقطة نهاية الخادم. gRPC هو بديل بالتسلسل الثنائي (Protocol Buffers)، وهو أكثر إحكامًا بنسبة 30–40% من JSON وأسرع على الأجهزة المحمولة ذات الاتصالات غير المستقرة. WebSocket يُستخدم للتسجيل في الوقت الفعلي أثناء التصحيح ولكن نادرًا في الإنتاج بسبب استهلاك الطاقة.

Firebase Crashlytics: جمع الأعطال والسجلات

Firebase Crashlytics هو خدمة مجانية من Google لجمع تقارير الأعطال والسجلات المخصصة. إنه مدمج في Firebase SDK ولا يتطلب خادمًا منفصلاً. يقوم Crashlytics تلقائيًا بجمع stack traces وحالة الجهاز وإصدار نظام التشغيل والشاشات المفتوحة وقت العطل.

تُضاف السجلات المخصصة في Crashlytics عبر طريقة log() — لا تُرسل إلى الخادم فورًا بل تُخزن في مخزن مؤقت دائري وتُرفق بتقرير العطل التالي. هذا هو الفرق الرئيسي عن Sentry، حيث كل سجل هو حدث منفصل. الحد الأقصى لحجم السجلات المخصصة في Crashlytics هو 64 كيلوبايت لكل عطل.

kotlin
// Firebase Crashlytics — سجلات مخصصة على Android
import com.google.firebase.crashlytics.FirebaseCrashlytics

class CheckoutViewModel {
    fun processPayment(amount: Double) {
        FirebaseCrashlytics.getInstance()
            .log("Payment started: amount=$amount")
        try {
            process(amount)
        } catch (e: Exception) {
            FirebaseCrashlytics.getInstance()
                .recordException(e)
        }
    }
}

Firebase Crashlytics يدعم setUserIdentifier لربط الأعطال بمستخدمين محددين. هذا يساعد في تحديد ما إذا كان الخطأ جماعيًا أم يؤثر على مستخدم واحد فقط. setCustomKey يُضيف مفاتيح مخصصة لكل تقرير — إصدار اختبار A/B، المنطقة، الخطة التعريفية.

Sentry: breadcrumbs وسياق المستخدم

Sentry هي منصة لمراقبة الأخطاء تخزن ليس فقط تقارير الأعطال ولكن أيضًا جميع الأحداث المخصصة (breadcrumbs) كسجلات مستقلة. على عكس Crashlytics، يسمح Sentry بعرض تسلسل الأحداث قبل الخطأ بترتيب زمني — breadcrumbs مرئية في الواجهة دون الحاجة إلى إعادة بنائها من سجل العطل.

Breadcrumbs التلقائية في Sentry

يقوم SDK الخاص بـ Sentry تلقائيًا بجمع breadcrumbs للأحداث النظامية: تغييرات دورة حياة UIViewController (viewDidLoad, viewWillAppear)، اللمسات، الضغط على الأزرار، طلبات HTTP عبر URLSession. تظهر كل هذه الأحداث في الجدول الزمني للخطأ إلى جانب breadcrumbs المخصصة. لنظام Android، يتم جمع دورة حياة Activity وFragment وأحداث onClick وطلبات الشبكة عبر OkHttp بالمثل.

يقوم SDK الخاص بـ Sentry لنظامي iOS وAndroid تلقائيًا بجمع breadcrumbs لأحداث واجهة المستخدم: اللمسات، التنقل، دورة الحياة. يمكن للمطورين إضافة breadcrumbs مخصصة عبر addBreadcrumb() مع تحديد النوع والفئة والمستوى. يدعم Sentry التتبع الموزع: يقوم المسجل بربط breadcrumbs من جانب العميل مع طلبات الخلفية عبر معرف تتبع (trace ID).

swift
import Sentry

func trackCartEvent(action: String, itemId: String) {
    let crumb = Breadcrumb()
    crumb.level = .info
    crumb.category = "cart"
    crumb.message = "Cart \(action): \(itemId)"
    crumb.data = ["action": action, "item_id": itemId]
    SentrySDK.addBreadcrumb(crumb)
}

Logcat والوصول عن بُعد عبر ADB

Logcat هو نظام التسجيل القياسي لنظام Android، يمكن الوصول إليه عبر Android Debug Bridge (ADB). يقوم Logcat بجمع جميع رسائل النظام والتطبيقات، مصنفة حسب المستويات (V, D, I, W, E, F) والوسوم. يعمل الوصول عن بُعد إلى Logcat عبر ADB عبر USB أو Wi-Fi، ولكن فقط للأجهزة في وضع التصحيح — تطبيقات الإنتاج على الأجهزة بدون اتصال USB غير قابلة للوصول.

للتسجيل عن بُعد في الإنتاج على Android، تُستخدم بدائل: Logcat بحد ذاته لا يمكنه إرسال السجلات إلى خادم. دوره هو التشخيص المحلي. ولكن توجد أغلفة (Timber, LogcatLive) تقوم بتوجيه الرسائل إلى Firebase أو Sentry مع الحفاظ على API المعتادة Log.d / Log.e. يسمح Timber بتبديل المعالجات دون تغيير كود التطبيق — شجرة التصحيح تكتب في Logcat، وشجرة الإصدار ترسل إلى الخادم مع التجميع والضغط.

التجميع (Batching) وتحسين حركة المرور

التجميع (Batching) هو تجميع سجلات متعددة في طلب HTTP واحد لتوفير حركة المرور والبطارية. بدلاً من 50 طلب POST فردي، يرسل SDK مصفوفة JSON واحدة. الاستراتيجيات النموذجية: الإرسال وفقًا لجدول (كل 30 ثانية)، حسب العدد (كل 50 حدثًا)، أو حسب الحدث (فقط عند الأخطاء الحرجة).

للتطبيقات التي تضم ملايين المستخدمين، يمكن أن يصل حجم السجلات إلى تيرابايت يوميًا. يقلل التجميع من عدد الطلبات بمقدار 10–50 مرة ويقلل من حمل الخادم. Sentry يستخدم ضغط gzip على مستوى النقل، مما يقلل حجم البيانات بشكل إضافي بنسبة 60–70%.

kotlin
// تنفيذ بسيط للتجميع (batching) على Android
class LogBatcher {
    private val buffer = mutableListOf<LogEvent>()
    private val maxSize = 50
    private val intervalMs = 30_000L

    fun append(event: LogEvent) {
        buffer.add(event)
        if (buffer.size >= maxSize) flush()
    }

    suspend fun flush() {
        val batch = buffer.toList()
        buffer.clear()
        sendToServer(batch)
    }
}

الضغط وإزالة التكرار

gzip هو طريقة الضغط القياسية لنقل السجلات عبر HTTP. تقوم SDKs الخاصة بـ Sentry وCrashlytics بضغط جسم الطلب تلقائيًا قبل الإرسال. إزالة التكرار — إزالة الرسائل المكررة على جانب العميل: إذا حدث نفس الحدث 100 مرة في الثانية، يرسله SDK مرة واحدة مع حقل count = 100.

الأخطاء النموذجية للتسجيل عن بُعد

الخطأ الأكثر شيوعًا هو تسجيل البيانات الحساسة. تقوم SDKs الخاصة بـ remote logging بنقل البيانات إلى الخادم، وإذا قام المطور بتسجيل كلمة مرور أو رمز مميز أو بريد إلكتروني للمستخدم عن طريق الخطأ، فستظهر هذه البيانات في البنية التحتية السحابية. استخدم دائمًا تصفية PII (معلومات التعريف الشخصية) على مستوى SDK: لدى Sentry خطاف beforeSend مدمج لتنظيف البيانات قبل الإرسال.

المشكلة الثانية الشائعة هي التسجيل المفرط. إذا تم إرسال كل حركة إصبع إلى الخادم، ينمو حجم البيانات بشكل هائل، وكذلك تكاليف الخادم. حدد ميزانية للتسجيل: لا يزيد عن 1–5 أحداث لكل مستخدم في الدقيقة في الإنتاج. أرسل سجلات التصحيح فقط مع علامة يتم تفعيلها لأجهزة محددة.

الخطأ الثالث هو تجاهل سيناريو عدم الاتصال. إذا فقد SDK السجلات عند عدم وجود شبكة ولم يستعدها عند إعادة الاتصال، يصبح remote logging عديم الفائدة للمستخدمين ذوي الاتصالات غير المستقرة. جميع SDKs (Firebase, Sentry) تخزن السجلات تلقائيًا في ملف محلي وترسلها عند توفر الشبكة، ولكن يجب التحقق من هذا الإعداد.

الأسئلة الشائعة

ما الفرق بين Remote Logging وcrash reporting؟

Crash reporting يجمع فقط معلومات عن أعطال التطبيق. Remote Logging يجمع جميع الأحداث: السجلات المخصصة وbreadcrumbs ومقاييس الأداء وأحداث واجهة المستخدم. Crash reporting هو مجموعة فرعية من remote logging، وليس بديلاً عنه.

أي خدمة تختار: Firebase Crashlytics أم Sentry؟

Crashlytics مجاني وكافٍ لتقارير الأعطال الأساسية. Sentry أفضل إذا كنت بحاجة إلى breadcrumbs والتتبع الموزع ولوحات المعلومات المخصصة والتنبيهات المرنة. للمشاريع المؤسسية مع متطلبات الامتثال، يتوفر Sentry في نسخة مستضافة ذاتيًا.

كيف أتجنب تسجيل بيانات غير ضرورية في الإنتاج؟

استخدم مستويات التسجيل: أرسل سجلات debug/info فقط من جهاز المطور باستخدام علامة isDebuggable. قم بتصفية المستويات الأخرى (warn, error) عبر خطاف beforeSend، مع إزالة الحقول التي تحتوي على PII. حدد الحد الأقصى لحجم السجل لكل جلسة.

هل يمكن استخدام Logcat للتجميع عن بُعد للسجلات؟

Logcat لا يدعم الإرسال عن بُعد إلى خادم. لـ remote logging على Android، استخدم Timber لتوجيه السجلات إلى Firebase أو Sentry، واترك Logcat للتصحيح عبر USB. Timber يستبدل API Log لنظام Android ويُضيف أشجارًا قابلة للزرع.

كم عدد السجلات التي يمكن إرسالها دون التأثير على البطارية؟

حتى 50 حدثًا في الدقيقة لكل جهاز لا تؤثر بشكل ملحوظ على استهلاك البطارية إذا تم استخدام التجميع (إرسال دفعات وليس واحدًا تلو الآخر). عند 200+ حدث في الدقيقة، سيكون Wi-Fi/المودم نشطًا باستمرار — تستنزف البطارية أسرع بنسبة 15–25%.

الخلاصة

  • Remote Logging — إرسال السجلات من جهاز محمول إلى خادم للتحليل المركزي، بما في ذلك تقارير الأعطال وbreadcrumbs ومقاييس الأداء
  • Firebase Crashlytics — خدمة مجانية من Google مع سجلات مخصصة في مخزن مؤقت دائري مرفقة بتقارير الأعطال
  • Sentry — منصة مع breadcrumbs مستقلة وتتبع موزع، تتيح عرض تسلسل الأحداث قبل الخطأ دون إعادة بنائها من سجل العطل
  • التجميع (Batching) — تجميع 50+ سجلًا في طلب واحد مع ضغط gzip، مما يقلل حركة المرور وحمل الخادم بمقدار 10–50 مرة
  • تصفية PII — تنظيف إلزامي للبيانات الحساسة عبر خطافات beforeSend لمنع تسرب البيانات الشخصية إلى الخادم
  • ميزانية التسجيل — لا يزيد عن 1–5 أحداث لكل مستخدم في الدقيقة في الإنتاج، سجلات التصحيح فقط مع علامة isDebuggable على أجهزة محددة

سنقوم بتطوير تطبيق جوال جاهز

تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.

مناقشة المشروع

اقرأ أيضًا