فهم التسجيل

تتناول هذه المقالة عملية التسجيل ، بما في ذلك معايير السجل وإرشادات المستوى والفئات والأغراض والتقديرات التقريبية متعددة الأخطاء.

معايير السجل

يعد تسجيل الدخول إلى Android معقدًا بسبب مزيج المعايير المستخدمة التي يتم دمجها في logcat . المعايير الرئيسية المستخدمة مفصلة أدناه:

مصدر أمثلة دليل مستوى المكدس
RFC 5424 syslog معيار سجل النظام) نواة لينكس والعديد من تطبيقات يونكس نواة ، نظام شياطين
android.util.Log إطار عمل Android + تسجيل التطبيق إطار عمل Android وتطبيق النظام
java.util.logging.Level تسجيل الدخول العام في Java تطبيق غير نظام

الشكل 1: معايير مستوى السجل.

على الرغم من أن كل معيار من هذه المعايير له نفس المستوى من البناء ، إلا أنه يختلف من حيث الدقة. المعادلات التقريبية عبر المعايير هي كما يلي:

مستوى RFC 5424 RFC 5424 الخطورة وصف RFC 5424 android.util.Log java.util.logging.Level
0 طارئ النظام غير قابل للاستخدام Log.e / Log.wtf SEVERE
1 يُحذًِر يجب اتخاذ الإجراءات على الفور Log.e / Log.wtf SEVERE
2 حرج - انتقادي الظروف الحرجة Log.e / Log.wtf SEVERE
3 خطأ شروط الخطأ Log.e SEVERE
4 تحذير شروط التحذير Log.w WARNING
5 تنويه طبيعي لكن مهم Log.w WARNING
6 معلومات رسائل المعلومات Log.i INFO
7 تصحيح رسائل مستوى التصحيح Log.d CONFIG ، FINE
- - رسائل مطولة Log.v FINER / FINEST

الشكل 2: مستويات تسجيل syslog و Android و Java.

إرشادات مستوى السجل

هناك إرشادات حالية معطاة لكل معيار سجل. يتبع مستوى السجل المختار المعيار المناسب المستخدم ، مثل استخدام معيار syslog لتطوير kernel.

تظهر أوامر مستوى السجل ، من الأقل إلى الأكثر ، في الأشكال الثلاثة أدناه:

ERROR يتم الاحتفاظ دائمًا بهذه السجلات.
WARN يتم الاحتفاظ دائمًا بهذه السجلات.
INFO يتم الاحتفاظ دائمًا بهذه السجلات.
DEBUG يتم تجميع هذه السجلات ولكن يتم تجريدها في وقت التشغيل.
VERBOSE لا يتم تجميع هذه السجلات مطلقًا في تطبيق إلا أثناء التطوير.

الشكل 3: android.util.Log

CONFIG مستوى الرسالة لرسائل التكوين الثابتة
FINE مستوى الرسالة توفير معلومات التتبع
FINER يشير إلى رسالة تتبع مفصلة إلى حد ما
FINEST يشير إلى رسالة تتبع مفصلة للغاية
INFO مستوى الرسالة للرسائل الإعلامية
SEVERE مستوى الرسالة يشير إلى فشل خطير
WARNING مستوى الرسالة يشير إلى مشكلة محتملة

الشكل 4: java.util.Logging.Level .

0 طارئ النظام غير قابل للاستخدام
1 يُحذًِر يجب اتخاذ الإجراءات على الفور
2 حرج - انتقادي الظروف الحرجة
3 خطأ شروط الخطأ
4 تحذير شروط التحذير
5 تنويه حالة طبيعية ولكنها مهمة
6 معلوماتية رسائل إعلامية
7 تصحيح رسائل مستوى التصحيح

الشكل 5: RFC 5424 - القسم 6.2.1 .

تسجيل التطبيق

يتم إجراء التسجيل الانتقائي باستخدام TAG بواسطة android.util.Log class باستخدام Log#isLoggable ، كما هو موضح أدناه:

if (Log.isLoggable("FOO_TAG", Log.VERBOSE)) {
 Log.v("FOO_TAG", "Message for logging.");
}

يمكن ضبط السجلات في وقت التشغيل لتوفير مستوى تسجيل محدد كما هو موضح أدناه:

adb shell setprop log.tag.FOO_TAG VERBOSE

log.tag.* يتم إعادة تعيين الخصائص عند إعادة التشغيل. هناك متغيرات ثابتة تبقى عبر عمليات إعادة التشغيل أيضًا. انظر أدناه:

adb shell setprop persist.log.tag.FOO_TAG VERBOSE

عمليات التحقق من السجل Log#isLoggable تترك آثار السجل في رمز التطبيق. تتجاوز علامات DEBUG المنطقية تتبعات السجل باستخدام تحسينات المحول البرمجي التي تم تعيينها على false ، كما هو موضح أدناه:

private final static boolean DEBUG = false;

… If (DEBUG) { Log.v("FOO_TAG", "Extra debug logging."); }

يمكن إزالة التسجيل على أساس كل ملف APK عبر مجموعات قواعد ProGuard بواسطة R8 في وقت الترجمة. يزيل المثال التالي كل شيء أسفل تسجيل مستوى INFO لـ android.util.Log :

# This allows proguard to strip isLoggable() blocks containing only <=INFO log
# code from release builds.
-assumenosideeffects class android.util.Log {
  static *** i(...);
  static *** d(...);
  static *** v(...);
  static *** isLoggable(...);
}
-maximumremovedandroidloglevel 4

هذا مفيد للتعامل مع أنواع إنشاءات متعددة للتطبيقات (على سبيل المثال ، إصدارات التطوير مقابل إصدارات الإصدارات) حيث من المتوقع أن تكون الشفرة الأساسية هي نفسها ، ولكن مستويات السجل المسموح بها مختلفة. يجب تعيين سياسة واضحة واتباعها للتطبيقات (خاصة تطبيقات النظام) لتحديد كيفية تأثير أنواع الإنشاءات وإصدار التوقعات على إخراج السجل.

تسجيل النظام في Android Runtime (ART)

هناك العديد من الفئات المتاحة لتطبيقات وخدمات النظام:

فصل غرض
android.telephony.Rlog تسجيل الراديو
android.util.Log تسجيل التطبيق العام
android.util.EventLog تسجيل حدث تشخيص تكامل النظام
android.util.Slog تسجيل إطار عمل النظام الأساسي

الشكل 6: فئات وأغراض سجل النظام المتاحة.

على الرغم من أن android.util.Log و android.util.Slog يستخدمان نفس معايير مستوى السجل ، فإن Slog عبارة عن فئة @hide قابلة للاستخدام فقط من خلال النظام الأساسي. يتم تعيين مستويات EventLog إلى الإدخالات الموجودة في ملف event.logtags في /system/etc/event-log-tags .

التسجيل الأصلي

يتبع تسجيل الدخول C / C ++ معيار syslog مع syslog (2) المطابق لـ Linux kernel syslog الذي يتحكم في المخزن المؤقت printk ، و syslog (3) المقابل لمسجل النظام العام. يستخدم Android مكتبة liblog لتسجيل النظام العام.

يوفر liblog أغلفة لمجموعات المدونات الفرعية باستخدام نموذج الماكرو التالي:

[Sublog Buffer ID] LOG [Log Level ID]

RLOGD ، على سبيل المثال ، يتوافق مع [Radio log buffer ID] LOG [Debug Level] . أغلفة liblog الرئيسية هي كما يلي:

فئة الغلاف مثال على وظائف
log_main.h ALOGV ، ALOGW
log_radio.h RLOGD ، RLOGE
log_system.h SLOGI ، SLOGW

الشكل 7: أغلفة liblog .

يحتوي Android على واجهات ذات مستوى أعلى للتسجيل مفضلة على استخدام liblog المباشر ، كما هو موضح أدناه:

مكتبة إستعمال
async_safe المكتبة فقط للتسجيل من البيئات الآمنة للإشارة غير المتزامنة
libbase مكتبة التسجيل التي توفر واجهة دفق C ++ للتسجيل ، على غرار التسجيل على غرار Google (glog). يمكن libbase في كلا المشروعين الخارجيين ومتاح في التطبيقات التي تستخدم libbase_ndk .

الشكل 8: مكتبات السجلات ذات المستوى الأعلى.

تقريبات الكومة المتعددة

نظرًا للاختلافات في التفاصيل والقصد من المستوى ، لا توجد مطابقة واضحة أو دقيقة لمعايير التسجيل المختلفة. على سبيل المثال ، مستويات java.util.logging.Level و android.util.Log لسجلات الأخطاء ليست مطابقة 1: 1:

java.util.Logging.Level android.util.Log
شديد Log.wtf
شديد Log.e

الشكل 9: مستوى الخطأ في تسجيل Java القياسي مقابل تسجيل Android.

في مثل هذه الحالات ، استخدم المعيار الفردي لتحديد المستوى المطلوب تطبيقه.

أثناء تطوير النظام بمكونات متعددة على مستوى المكدس ، اتبع الشكل 1 لتحديد المعيار الذي يجب استخدامه لكل مكون. للحصول على دليل تقريبي لمراسلة الفئات ، اتبع الشكل 2.

الأمن والخصوصية

لا تسجل معلومات التعريف الشخصية (PII). يتضمن هذا تفاصيل مثل:

  • عناوين البريد الإلكتروني
  • أرقام الهاتف
  • الأسماء

وبالمثل ، تعتبر بعض التفاصيل حساسة حتى لو لم تكن محددة بشكل شخصي.

على سبيل المثال ، على الرغم من أن معلومات المنطقة الزمنية لا تعتبر معلومات شخصية ، إلا أنها تشير إلى الموقع التقريبي للمستخدم.

يجب التعامل مع سياسة السجل والتفاصيل المقبولة كجزء من مراجعة الأمان والخصوصية قبل الإصدار.

سجلات الجهاز

الوصول إلى جميع سجلات الجهاز ، بما في ذلك استخدام android.permission.READ_LOGS مقيد:

  • إذا طلب أحد التطبيقات الموجودة في الخلفية الوصول إلى جميع سجلات الجهاز ، فسيتم رفض الطلب تلقائيًا ما لم يكن التطبيق:
    • يشارك النظام UID.
    • يستخدم عملية نظام أصلي ( UID < APP_UID ).
    • يستخدم DropBoxManager .
    • يصل فقط إلى المخزن المؤقت لسجل الأحداث.
    • يستخدم EventLog API.
    • يستخدم الاختبارات المجهزة.
  • إذا طلب أحد التطبيقات في المقدمة مع READ_LOGS الوصول إلى سجلات الجهاز ، فإن النظام يطالب المستخدم بالموافقة على طلب الوصول أو رفضه.