تتناول هذه المقالة عملية التسجيل، بما في ذلك معايير السجل وإرشادات المستوى والفئات والأغراض والتقريبات متعددة المكدسات.
معايير السجلّ
يُعد تسجيل الدخول إلى 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; |
---|
يمكن إزالة التسجيل لكل ملف 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
الإذن بالوصول إلى سجلات الجهاز، المستخدم للموافقة على طلب الوصول أو رفضه.