این مقاله فرآیند ثبت وقایع، از جمله استانداردهای ثبت وقایع، دستورالعملهای سطح، کلاسها، اهداف و تقریبهای چندپشتهای را پوشش میدهد.
استانداردهای لاگ
ورود به سیستم در اندروید به دلیل ترکیبی از استانداردهای مورد استفاده که در logcat با هم ترکیب شدهاند، پیچیده است. استانداردهای اصلی مورد استفاده در زیر شرح داده شدهاند:
| منبع | مثالها | راهنمایی سطح پشته |
|---|---|---|
RFC 5424 (استاندارد syslog ) | هسته لینوکس، بسیاری از برنامههای یونیکس | هسته، دیمنهای سیستم |
android.util.Log | چارچوب اندروید + ثبت وقایع برنامه | چارچوب اندروید و برنامه سیستمی |
java.util.logging.Level | ورود عمومی به سیستم در جاوا | برنامه غیر سیستمی |
شکل ۱: استانداردهای سطح لاگ.
اگرچه هر یک از این استانداردها ساختار سطح مشابهی دارند، اما از نظر جزئیات با هم متفاوت هستند. معادلهای تقریبی در بین استانداردها به شرح زیر است:
| سطح RFC 5424 | شدت RFC 5424 | شرح RFC 5424 | گزارش.کاربردی اندروید | سطح لاگ گیری java.util.logging |
|---|---|---|---|---|
| 0 | اورژانس | سیستم غیرقابل استفاده است | Log.e / Log.wtf | SEVERE |
| ۱ | هشدار | باید فوراً اقدام شود | Log.e / Log.wtf | SEVERE |
| ۲ | بحرانی | شرایط بحرانی | Log.e / Log.wtf | SEVERE |
| ۳ | خطا | شرایط خطا | Log.e | SEVERE |
| ۴ | هشدار | شرایط هشدار | Log.w | WARNING |
| ۵ | اطلاعیه | معمولی اما قابل توجه | Log.w | WARNING |
| ۶ | اطلاعات | پیام رسانی اطلاعاتی | Log.i | INFO |
| ۷ | اشکالزدایی | پیامهای سطح اشکالزدایی | Log.d | CONFIG ، FINE |
| - | - | پیامرسانی طولانی | Log.v | FINER / FINEST |
شکل ۲: سطوح ثبت وقایع syslog ، اندروید و جاوا.
دستورالعملهای سطح لاگ
برای هر استاندارد لاگ، دستورالعملهای مشخصی وجود دارد. سطح لاگ انتخاب شده از استاندارد مناسب مورد استفاده پیروی میکند، مانند استفاده از استاندارد syslog برای توسعه هسته.
ترتیبهای سطح لاگ، از کمترین به بیشترین، در سه شکل زیر نشان داده شدهاند:
ERROR | این سیاههها همیشه نگهداری می شوند. |
WARN | این سیاههها همیشه نگهداری می شوند. |
INFO | این سیاههها همیشه نگهداری می شوند. |
DEBUG | این لاگها کامپایل میشوند اما در زمان اجرا حذف میشوند. |
VERBOSE | این لاگها هرگز به یک برنامه کامپایل نمیشوند، مگر در زمان توسعه. |
شکل ۳: android.util.Log
CONFIG | سطح پیام برای پیامهای پیکربندی استاتیک |
FINE | سطح پیام، اطلاعات ردیابی را ارائه میدهد |
FINER | یک پیام ردیابی نسبتاً دقیق را نشان میدهد |
FINEST | یک پیام ردیابی بسیار دقیق را نشان میدهد |
INFO | سطح پیام برای پیامهای اطلاعاتی |
SEVERE | سطح پیام نشان دهنده یک نقص جدی است |
WARNING | سطح پیام که نشاندهندهی یک مشکل بالقوه است |
شکل ۴: java.util.Logging.Level .
| 0 | اورژانس | سیستم غیرقابل استفاده است |
| ۱ | هشدار | باید فوراً اقدام شود |
| ۲ | بحرانی | شرایط بحرانی |
| ۳ | خطا | شرایط خطا |
| ۴ | هشدار | شرایط هشدار |
| ۵ | اطلاعیه | شرایط عادی اما قابل توجه |
| ۶ | اطلاعاتی | پیامهای اطلاعاتی |
| ۷ | اشکالزدایی | پیامهای سطح اشکالزدایی |
شکل ۵: 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
|
|---|
این برای مدیریت چندین نوع ساخت برنامه (به عنوان مثال، ساختهای توسعه در مقابل ساختهای انتشار) مفید است که در آن انتظار میرود کد اصلی یکسان باشد، اما سطوح مجاز ثبت وقایع متفاوت است. باید یک سیاست صریح برای برنامهها (به ویژه برنامههای سیستمی) تنظیم و دنبال شود تا تصمیم گرفته شود که انواع ساخت و انتظارات انتشار چگونه بر خروجی گزارش تأثیر میگذارند.
ثبت وقایع سیستم در زمان اجرای اندروید (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 (2) مربوط به syslog هسته لینوکس است که بافر printk را کنترل میکند و syslog (3) مربوط به ثبتکننده عمومی سیستم است. اندروید از کتابخانه 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 .
اندروید رابطهای سطح بالاتری برای ثبت وقایع دارد که نسبت به استفاده مستقیم liblog ارجحیت دارند، همانطور که در زیر مشاهده میکنید:
| کتابخانه | کاربرد |
|---|---|
async_safe | فقط کتابخانه برای ثبت وقایع از محیطهای async-signal-safe |
libbase | کتابخانه ثبت وقایع که یک رابط جریان C++ برای ثبت وقایع ارائه میدهد، مشابه ثبت وقایع به سبک گوگل (glog). libbase هم در پروژههای خارجی قابل استفاده است و هم در برنامههایی که از libbase_ndk استفاده میکنند، در دسترس است. |
شکل ۸: کتابخانههای لاگ سطح بالاتر.
تقریبهای چندپشتهای
به دلیل تفاوت در جزئیات و هدف سطح، هیچ تطابق واضح یا دقیقی بین استانداردهای مختلف ثبت وقایع وجود ندارد. برای مثال، سطوح java.util.logging.Level و android.util.Log برای گزارشهای خطا، تطابق یک به یک نیستند:
| سطح گزارشگیری java.util.Logging | گزارش.کاربردی اندروید |
|---|---|
| شدید | Log.wtf |
| شدید | Log.e |
شکل ۹: سطح خطا در ثبت وقایع استاندارد جاوا در مقایسه با ثبت وقایع اندروید.
در مواردی از این دست، از استاندارد فردی برای تعیین سطح مورد نظر استفاده کنید.
در طول توسعه سیستم با اجزای چندگانه سطح پشته، برای تعیین اینکه از کدام استاندارد برای هر جزء استفاده شود، شکل 1 را دنبال کنید. برای یک راهنمای تقریبی برای پیامرسانی لایهای، شکل 2 را دنبال کنید.
امنیت و حریم خصوصی
اطلاعات شخصی قابل شناسایی (PII) را ثبت نکنید. این شامل جزئیاتی مانند موارد زیر است:
- آدرسهای ایمیل
- شماره تلفنها
- نامها
به همین ترتیب، جزئیات خاصی حتی اگر به صراحت قابل شناسایی شخصی نباشند، حساس تلقی میشوند.
برای مثال، اگرچه اطلاعات منطقه زمانی قابل شناسایی شخصی محسوب نمیشود، اما نشاندهنده موقعیت تقریبی کاربر است.
سیاست ثبت وقایع و جزئیات قابل قبول باید به عنوان بخشی از بررسی امنیت و حریم خصوصی، قبل از انتشار، مورد بررسی قرار گیرند.
گزارشهای دستگاه
دسترسی به تمام گزارشهای دستگاه، از جمله استفاده از android.permission.READ_LOGS محدود شده است:
- اگر برنامهای در پسزمینه درخواست دسترسی به تمام گزارشهای دستگاه را داشته باشد، درخواست بهطور خودکار رد میشود، مگر اینکه برنامه:
- شناسه کاربری سیستم (UID) را به اشتراک میگذارد.
- از یک فرآیند سیستمی بومی (
UID<APP_UID) استفاده میکند. - از
DropBoxManagerاستفاده میکند. - فقط به بافر گزارش رویدادها دسترسی دارد.
- از API
EventLogاستفاده میکند. - از آزمایشهای ابزار دقیق استفاده میکند.
- اگر برنامهای در پیشزمینه با
READ_LOGSدرخواست دسترسی به گزارشهای دستگاه را داشته باشد، سیستم از کاربر میخواهد که درخواست دسترسی را تأیید یا رد کند.