تتناول هذه المقالة عملية التسجيل، بما في ذلك معايير السجلّات وإرشادات المستويات والفئات والأغراض والتقريبات المتعدّدة الحِزم.
معايير السجلّ
إنّ تسجيل الدخول على Android معقّد بسبب مزيج المعايير المستخدَمة التي يتم
دمجها في logcat
. في ما يلي تفاصيل المعايير الرئيسية المستخدَمة:
المصدر | أمثلة | إرشادات على مستوى الحزمة |
---|---|---|
RFC 5424 (syslog العادي) |
نواة Linux والعديد من تطبيقات Unix | نواة النظام وبرامج الخدمة |
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; |
---|
يمكن إزالة التسجيل لكل حزمة APK من خلال قواعد ProGuard من قِبل R8
في وقت compilation. يزيل المثال التالي كل السجلّات التي تقلّ عن مستوى 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 syslog
التي تتحكّم في ذاكرة التخزين المؤقت printk
وsyslog
(3)
الذي يتوافق مع أداة تسجيل النظام العام. يستخدم نظام التشغيل Android مكتبة liblog
لتسجيل بيانات النظام العامة.
liblog
يوفّر مجموعات لفائف لمجموعات البلاگات الفرعية باستخدام التنسيق التالي لل macro:
[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
الوصول إلى سجلات الجهاز، يطلب نظام من المستخدم الموافقة على طلب الوصول أو رفضه.