این مقاله فرایند گزارشگیری را پوشش میدهد، ازجمله استانداردهای گزارش، دستورالعملهای سطح، کلاسها، اهداف، و تقریبهای چند پشتهای.
استانداردهای گزارش
ثبت گزارش در Android بهدلیل ترکیب استانداردهای استفادهشده که در logcat ترکیب شدهاند پیچیده است. استانداردهای اصلی مورد استفاده در زیر شرح داده شده است:
| منبع | نمونهها | راهنمای سطح دسته |
|---|---|---|
RFC 5424 (syslog استاندارد) |
هسته Linux، بسیاری از برنامههای Unix | هسته، دیمونهای سیستم |
android.util.Log |
چارچوب Android + ثبت گزارش برنامه | چارچوب Android و برنامه سیستم |
java.util.logging.Level |
ثبت گزارش عمومی در جاوا | برنامه غیرسیستمی |
شکل ۱: استانداردهای سطح گزارش.
اگرچه هریک از این استانداردها ساختار سطح مشابهی دارند، اما در جزئیات متفاوت هستند. معادلهای تقریبی در استانداردهای مختلف به شرح زیر است:
| سطح 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 |
شکل ۲: سطوح گزارشگیری syslog، Android، و Java.
رهنمودهای سطح گزارش
رهنمودهای موجودی برای هر استاندارد گزارش ارائه شده است. سطح گزارش انتخابی از استاندارد مناسب مورداستفاده پیروی میکند، مثلاً از استاندارد syslog برای توسعه هسته استفاده میکند.
ترتیب سطح گزارش، از کمترین به بیشترین، در سه شکل زیر نشان داده شده است:
ERROR |
این گزارشها همیشه نگهداری میشوند. |
WARN |
این گزارشها همیشه نگهداری میشوند. |
INFO |
این گزارشها همیشه نگهداری میشوند. |
DEBUG |
این گزارشها در زمان اجرا گردآوری میشوند اما از آنها اطلاعاتی استخراج نمیشود. |
VERBOSE |
این گزارشها هرگز در برنامهای گردآوری نمیشوند، بهجز درطول توسعه. |
شکل ۳: android.util.Log
CONFIG |
سطح پیام برای پیامهای پیکربندی ایستا |
FINE |
سطح پیام ارائهدهنده اطلاعات ردیابی |
FINER |
نشاندهنده پیام ردیابی نسبتاً دقیق |
FINEST |
نشاندهنده پیام ردیابی بسیار دقیق است |
INFO |
سطح پیام برای پیامهای اطلاعاتی |
SEVERE |
سطح پیام نشاندهنده خطای جدی |
WARNING |
سطح پیام نشاندهنده مشکل احتمالی است |
شکل ۴: java.util.Logging.Level.
| 0 | اضطراری | سیستم غیرقابل استفاده است |
| 1 | هشدار | کنش باید بلافاصله انجام شود |
| 2 | مهم | شرایط بحرانی |
| 3 | خطا | شرایط خطا |
| 4 | هشدار | شرایط هشدار |
| 5 | اعلامیه | وضعیت عادی اما قابلتوجه |
| 6 | اطلاعاتی | پیامهای اطلاعاتی |
| 7 | اشکالزدایی کردن | پیامهای سطح اشکالزدایی |
شکل ۵: RFC 5424 - بخش
۶.۲.۱.
گزارشگیری برنامه
گزارشگیری انتخابی با 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 |
گزارشگیری چارچوب پلاتفرم |
شکل ۶: کلاسها و اهداف گزارش سیستم دردسترس.
اگرچه android.util.Log و android.util.Slog از استانداردهای سطح گزارش یکسانی استفاده میکنند، Slog یک کلاس @hide است که فقط توسط پلاتفرم قابل استفاده است. سطوح EventLog
با ورودیهای موجود در فایل event.logtags
در /system/etc/event-log-tags نگاشت شدهاند.
ثبت بومی
ورود به سیستم در C/C++ از استاندارد syslog پیروی میکند و syslog(۲) مربوط به
هسته Linux syslog است که بافر printk را کنترل میکند و syslog(۳)
مربوط به گزارشگر سیستم عمومی است. 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 |
شکل ۷: liblog بستهبندی.
Android میاناهای سطح بالاتری برای ثبت گزارش دارد که نسبت به استفاده مستقیم
liblog ترجیح داده میشوند، همانطور که در زیر نشان داده شده است:
| کتابخانه | کاربرد |
|---|---|
async_safe |
کتابخانه فقط برای ثبت گزارش از محیطهای ایمن از سیگنال ناهمگام |
libbase |
کتابخانه گزارشگیری که رابط جاریسازی C++ برای گزارشگیری ارائه میدهد، مشابه گزارشگیری
به سبک Google (glog). libbase در هر دو پروژه خارجی قابلاستفاده است
و در برنامههایی که از libbase_ndk استفاده میکنند دردسترس است. |
شکل ۸: کتابخانههای گزارش سطح بالاتر.
تقریبهای چندپشتهای
بهدلیل تفاوت در جزئیات و هدف سطح، هیچ تطابق واضح یا دقیقی بین استانداردهای مختلف ثبت گزارش وجود ندارد. برای مثال، سطوح
java.util.logging.Level و android.util.Log برای گزارشهای خطای
مطابقت یکبهیک ندارند:
| java.util.Logging.Level | android.util.Log |
|---|---|
| شدید | Log.wtf |
| شدید | Log.e |
شکل ۹: سطح خطا در گزارشگیری استاندارد جاوا در مقایسه با گزارشگیری Android.
در مواردی مانند این، از استاندارد فردی برای تعیین سطح موردنظر برای اعمال استفاده کنید.
درطول توسعه سیستم با مؤلفههای چندسطحی پشته، از شکل ۱ پیروی کنید تا مشخص شود برای هر مؤلفه از کدام استاندارد استفاده شود. برای راهنمایی تقریبی درباره پیامرسانی براساس سطح، «شکل ۲» را دنبال کنید.
امنیت و حریم خصوصی
اطلاعات شناساننده شخصی (PII) را ثبت نکنید. این شامل جزئیاتی مثل موارد زیر میشود:
- نشانی ایمیل
- شمارههای تلفن
- نام
بههمین ترتیب، برخی جزئیات حتی اگر بهطور صریح شناساننده شخصی نباشند، حساس درنظر گرفته میشوند.
برای مثال، اگرچه اطلاعات منطقه زمانی بهعنوان اطلاعات شناساننده شخصی درنظر گرفته نمیشود،
اما نشانهای از مکان تقریبی کاربر ارائه میدهد.
خطمشی گزارش و جزئیات قابلقبول باید بهعنوان بخشی از بررسی امنیت و حریم خصوصی قبلاز انتشار مدیریت شود.
گزارشهای دستگاه
دسترسی به همه گزارشهای دستگاه، ازجمله استفاده از
android.permission.READ_LOGS
محدود شده است:
- اگر برنامهای در پسزمینه درخواست دسترسی به همه گزارشهای دستگاه را داشته باشد، درخواست بهطور خودکار رد میشود، مگر اینکه برنامه:
- «شناسه کاربری» سیستم را همرسانی میکند.
- از فرایند سیستم بومی (
UID<APP_UID) استفاده میکند. - از
DropBoxManagerاستفاده میکند. - فقط به میانگیری گزارش رویداد دسترسی دارد.
- از
EventLogAPI استفاده میکند. - از آزمونهای ابزاری استفاده میکند.
- اگر برنامهای در پیشزمینه با
READ_LOGSدرخواست دسترسی به گزارشهای دستگاه کند، سیستم از کاربر میخواهد درخواست دسترسی را تأیید یا رد کند.