تتناول هذه المقالة عملية التسجيل، بما في ذلك معايير السجل وإرشادات المستوى والفئات والأغراض والتقديرات التقريبية للمكدسات المتعددة.
معايير السجل
يعد تسجيل الدخول إلى Android أمرًا معقدًا نظرًا لمزيج المعايير المستخدمة المدمجة في logcat
. المعايير الرئيسية المستخدمة مفصلة أدناه:
مصدر | أمثلة | توجيه مستوى المكدس |
---|---|---|
RFC 5424 (معيار syslog ) | نواة لينكس والعديد من تطبيقات يونكس | النواة، شياطين النظام |
android.util.Log | إطار عمل Android + تسجيل التطبيقات | إطار عمل أندرويد وتطبيق النظام |
java.util.logging.Level | تسجيل الدخول العام في جافا | تطبيق غير النظام |
الشكل 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
في وقت الترجمة. يزيل المثال التالي كل شيء أسفل تسجيل مستوى 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 kernel الذي يتحكم في المخزن المؤقت 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
. - يستخدم الاختبارات المجهزة.
- إذا طلب تطبيق في المقدمة يحتوي على
READ_LOGS
الوصول إلى سجلات الجهاز، فسيطالب النظام المستخدم بالموافقة على طلب الوصول أو رفضه.