הבנת רישום

מאמר זה מכסה את תהליך הרישום, כולל תקני יומן, הנחיות רמות, מחלקות, מטרות וקירוב רב-ערימות.

תקני יומן

הכניסה לאנדרואיד היא מורכבת בשל תמהיל הסטנדרטים המשולבים ב- logcat . התקנים העיקריים בהם נעשה שימוש מפורטים להלן:

מָקוֹר דוגמאות הדרכה ברמת הערימה
RFC 5424 (תקן syslog ) ליבת לינוקס, יישומי יוניקס רבים ליבה, דמוני מערכת
android.util.Log מסגרת אנדרואיד + רישום אפליקציות מסגרת ואפליקציית מערכת של אנדרואיד
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;

… 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 רישום מסגרת פלטפורמה

איור 6: כיתות ומטרות יומן מערכת זמינות.

למרות 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) המתאים ל-logger של המערכת הכללי. אנדרואיד משתמש בספריית 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 ספרייה רק ​​לרישום מסביבות בטוחות לא-סינכרון
libbase ספריית רישום המספקת ממשק זרם C++ לרישום, בדומה לרישום בסגנון גוגל (גלוג). 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 רגיל לעומת רישום אנדרואיד.

במקרים כאלה, השתמש בתקן האישי כדי לקבוע איזו רמה ליישם.

במהלך פיתוח מערכת עם מספר רכיבים ברמת מחסנית, עקוב אחר איור 1 כדי לקבוע באיזה תקן להשתמש לכל רכיב. לקבלת מדריך משוער להעברת הודעות בשכבות, עקוב אחר איור 2.

בטיחות ופרטיות

אין לרשום מידע אישי מזהה (PII). זה כולל פרטים כגון:

  • כתובות דוא"ל
  • מספרי טלפון
  • שמות

באופן דומה, פרטים מסוימים נחשבים לרגישים גם אם אינם ניתנים לזיהוי אישי במפורש.

לדוגמה, למרות שמידע על אזור זמן אינו נחשב לזיהוי אישי, הוא נותן אינדיקציה למיקום המשוער של משתמש.

יש לטפל במדיניות היומן ובפרטים המקובלים כחלק מבדיקת האבטחה והפרטיות לפני השחרור.

יומני מכשיר

הגישה לכל יומני המכשירים, כולל שימוש android.permission.READ_LOGS מוגבלת:

  • אם אפליקציה ברקע מבקשת גישה לכל יומני המכשירים, הבקשה תידחה אוטומטית אלא אם האפליקציה:
    • משתף את ה-UID של המערכת.
    • משתמש בתהליך מערכת מקורי ( UID < APP_UID ).
    • משתמש DropBoxManager .
    • ניגש רק למאגר יומן האירועים.
    • משתמש ב- EventLog API.
    • משתמש בבדיקות מכשור.
  • אם אפליקציה בחזית עם READ_LOGS מבקשת גישה ליומני מכשירים, המערכת מבקשת מהמשתמש לאשר או לדחות את בקשת הגישה.