הסבר על רישום ביומן

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

רגילים ביומן

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

מקור דוגמאות הנחיות ברמת המקבץ
RFC 5424 (רגילה של syslog) הליבה של Linux, אפליקציות Unix רבות ליבה (Kernel), דימון (daemon) של מערכת
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 עוקפים מעקבים ביומן באמצעות אופטימיזציות מהדר (compiler) שמוגדרות 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

האפשרות הזו שימושית אם רוצים לטפל בכמה סוגי build של אפליקציות ( לדוגמה, גרסאות build של פיתוח לעומת גרסאות build שלהן, שבהם הקוד הבסיסי צפויות להיות זהות, אבל רמות היומן המותרות שונות. תוכן בוטה יש להגדיר מדיניות ולפעול לפיה באפליקציות (במיוחד באפליקציות אפליקציות) כדי לקבוע איך סוגי ה-build והצגות ציפיות משפיעים על היומן הפלט.

רישום ביומן של המערכת בזמן הריצה של Android (ART)

יש כמה כיתות זמינות שזמינות למערכת אפליקציות ושירותים:

כיתה מטרה
android.telephony.Rlog רישום ביומן של תחנות רדיו
android.util.Log רישום כללי של אפליקציות ביומן
android.util.EventLog רישום של אירועי אבחון של מטמיע מערכות
android.util.Slog רישום ביומן של framework של הפלטפורמה

איור 6: הסוגים הזמינים של יומני המערכת והמטרות שלהם.

למרות ש-android.util.Log ו-android.util.Slog משתמשים באותה רמת יומן רגילים, Slog הוא מחלקה @hide שאפשר להשתמש בה רק בפלטפורמה. EventLog הרמות ממופות לערכים ב-event.logtags בקובץ /system/etc/event-log-tags.

רישום מקורי ביומן

התחברות אל C/C++ עומדת בתקן syslog עם syslog(2) שתואם ל- הליבה של Linux syslog ששולטת במאגר הנתונים הזמני של printk ו-syslog(3) שתואם ליומן המערכת הכללי. מערכת Android משתמשת בliblog הרישום ביומן המערכת הכללי.

liblog מספק wrappers לקבוצות יומני המשנה באמצעות פקודת המאקרו הבאה טופס:

[Sublog Buffer ID] LOG [Log Level ID]

לדוגמה, RLOGD תואם ל-[Radio log buffer ID] LOG [Debug Level]. ה-wrappers העיקריים של liblog הם:

סיווג Wrapper פונקציות לדוגמה
log_main.h ALOGV, ALOGW
log_radio.h RLOGD, RLOGE
log_system.h SLOGI, SLOGW

איור 7: wrappers liblog.

ל-Android יש ממשקים ברמה גבוהה יותר לרישום ביומן, שמועדפים על פני יומן ישיר השימוש ב-liblog, כמו שאפשר לראות:

ספרייה שימוש
async_safe ספרייה רק עבור רישום ביומן מסביבות בטוחות מסוג אסינכרוני-אות
libbase ספריית רישום ביומן שמספקת ממשק סטרימינג של C++ לרישום ביומן, בדומה ל- רישום ביומן בסגנון Google (glog). אפשר להשתמש ב-libbase גם בפרויקטים חיצוניים וזמין באפליקציות שנעשה בהן שימוש ב-libbase_ndk.

איור 8: ספריות יומן ברמה גבוהה יותר.

הערכה של Multistack

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