فهم التسجيل

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

معايير السجلّ

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

المصدر أمثلة إرشادات على مستوى الحزمة
RFC 5424 (معيار واحد (syslog)) نواة Linux والعديد من تطبيقات Unix النواة (kernel)، البرامج الخفية للنظام
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 معيارًا لتطوير النواة.

يتم عرض طلبات مستوى السجل، من الأقل إلى الأعلى، في الأشكال الثلاثة التالية:

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) باستخدام 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" (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) وفقًا لما يلي: نواة syslog من Linux التي تتحكّم في المخزن المؤقت لـ 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++ للتسجيل، مثل التسجيل (glog) بأسلوب Google يمكن استخدام 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 < APP_UID).
    • يتم استخدام DropBoxManager.
    • للوصول إلى المخزن المؤقت لسجل الأحداث فقط.
    • يتم استخدام واجهة برمجة تطبيقات EventLog.
    • استخدام اختبارات قياس حالة التطبيق
  • إذا طلب أحد التطبيقات التي تعمل في المقدّمة مع READ_LOGS الإذن بالوصول إلى سجلات الجهاز، المستخدم للموافقة على طلب الوصول أو رفضه.