במאמר הזה מוסבר על תהליך הרישום ביומן, כולל תקני יומן, הנחיות לגבי רמות, מחלקות, מטרות וקירובים של כמה מחסניות.
תקנים של יומנים
הרישום ב-Android הוא מורכב בגלל השילוב של סטנדרטים שונים שמשמשים ב-logcat
. הסטנדרטים העיקריים שבהם נעשה שימוש מפורטים בהמשך:
מקור | דוגמאות | הנחיות לגבי רמת הערימה |
---|---|---|
RFC 5424 (syslog רגיל) |
ליבת Linux, הרבה אפליקציות Unix | הליבה, שדי מערכת |
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
מדלגים על עקבות של יומנים באמצעות אופטימיזציות של קומפיילר שמוגדרות לערך
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 |
---|
האפשרות הזו שימושית כשמטפלים בכמה סוגים של בניית אפליקציות (לדוגמה, בניית אפליקציות לפיתוח לעומת בניית אפליקציות להפצה), כשמצפים שהקוד הבסיסי יהיה זהה אבל רמות היומן המותרות שונות. צריך להגדיר מדיניות ברורה לאפליקציות (במיוחד לאפליקציות מערכת) ולפעול לפיה כדי להחליט איך סוגי build וציפיות לגבי גרסאות משפיעים על פלט היומן.
רישום ביומן המערכת ב-Android Runtime (ART)
יש כמה מחלקות זמינות לאפליקציות ולשירותים של המערכת:
כיתה | Purpose |
---|---|
android.telephony.Rlog |
רישום ביומן של נתוני רדיו |
android.util.Log |
רישום כללי ביומן של האפליקציה |
android.util.EventLog |
רישום ביומן של אירועים אבחוניים של משלבי מערכות |
android.util.Slog |
Platform framework logging |
איור 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
מספק עטיפות לקבוצות של קובצי משנה של יומנים באמצעות הפורמט הבא של מאקרו:
[Sublog Buffer ID] LOG [Log Level ID] |
לדוגמה, RLOGD
מתאים ל-[Radio log buffer ID] LOG [Debug Level]
.
העטיפות העיקריות של liblog
הן:
Wrapper class | פונקציות לדוגמה |
---|---|
log_main.h |
ALOGV , ALOGW |
log_radio.h |
RLOGD , RLOGE |
log_system.h |
SLOGI , SLOGW |
איור 7: עטיפות liblog
.
ל-Android יש ממשקים ברמה גבוהה יותר לרישום ביומן, שמועדפים על פני שימוש ישיר, כפי שמוצג בהמשך:liblog
ספרייה | שימוש |
---|---|
async_safe |
ספרייה לרישום ביומן רק מסביבות בטוחות לאותות אסינכרוניים |
libbase |
ספריית רישום ביומן שכוללת ממשק של זרם C++ לרישום ביומן, בדומה לרישום ביומן בסגנון Google (glog). אפשר להשתמש ב-libbase גם בפרויקטים חיצוניים, והוא זמין באפליקציות שמשתמשות ב-libbase_ndk . |
איור 8: ספריות של יומני רישום ברמה גבוהה יותר.
קירובים של כמה ערימות
בגלל הבדלים ברמת הפירוט וברמת הכוונה, אין התאמות ברורות או מדויקות בין תקני רישום שונים ביומן. לדוגמה, הרמות java.util.logging.Level
ו-android.util.Log
ביומני שגיאות לא תואמות באופן מלא:
java.util.Logging.Level | android.util.Log |
---|---|
SEVERE | Log.wtf |
SEVERE | Log.e |
איור 9: רמת השגיאה ביומן הרישום הרגיל של Java לעומת יומן הרישום של Android.
במקרים כאלה, צריך להשתמש בתקן הספציפי כדי לקבוע איזו רמה להחיל.
במהלך פיתוח מערכת עם כמה רכיבים ברמת המערכת, צריך לפעול לפי איור 1 כדי לקבוע באיזה תקן להשתמש בכל רכיב. למדריך משוער בנושא הודעות לפי רמה, אפשר לעיין באיור 2.
אבטחה ופרטיות
אל תתעדו פרטים אישיים מזהים (PII). הפרטים האלה כוללים, בין היתר:
- כתובות אימייל
- מספרי טלפון
- שמות
באופן דומה, פרטים מסוימים נחשבים רגישים גם אם הם לא פרטים אישיים מזהים באופן מובהק.
לדוגמה, למרות שפרטים על אזור זמן לא נחשבים לפרטים אישיים מזהים, הם כן מצביעים על המיקום המשוער של המשתמש.
צריך לטפל במדיניות בנושא יומנים ובפרטים מקובלים כחלק מבדיקת האבטחה והפרטיות לפני הפרסום.
מקבצי היומן במכשיר
הגישה לכל יומני המכשיר, כולל השימוש ב-android.permission.READ_LOGS
, מוגבלת:
- אם אפליקציה ברקע מבקשת גישה לכל יומני המכשיר, הבקשה נדחית באופן אוטומטי, אלא אם האפליקציה:
- שיתוף של ה-UID של המערכת.
- נעשה שימוש בתהליך מערכת מקורי (
UID
<APP_UID
). - נעשה שימוש ב-
DropBoxManager
. - גישה רק למאגר הנתונים הזמני של יומן האירועים.
- נעשה שימוש ב-
EventLog
API. - משתמש בבדיקות עם מכשור.
- אם אפליקציה בחזית עם
READ_LOGS
מבקשת גישה ליומני המכשיר, המערכת מבקשת מהמשתמש לאשר או לדחות את בקשת הגישה.