ورود به سیستم را درک کنید

این مقاله فرآیند ثبت وقایع، از جمله استانداردهای ثبت وقایع، دستورالعمل‌های سطح، کلاس‌ها، اهداف و تقریب‌های چندپشته‌ای را پوشش می‌دهد.

استانداردهای لاگ

ورود به سیستم در اندروید به دلیل ترکیبی از استانداردهای مورد استفاده که در 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;

… If (DEBUG) { Log.v("FOO_TAG", "Extra debug logging."); }

ثبت وقایع می‌تواند بر اساس هر 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 درخواست دسترسی به گزارش‌های دستگاه را داشته باشد، سیستم از کاربر می‌خواهد که درخواست دسترسی را تأیید یا رد کند.