המאמר הזה עוסק בתהליך הרישום ביומן, כולל סטנדרטים של יומנים, הנחיות לגבי רמות, סיווגים, מטרות וקירובים של ריבוי סטאקים.
רגילים ביומן
ההתחברות ל-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; |
---|
ניתן להסיר את הרישום ביומן על בסיס 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
מבקשת גישה ליומני המכשיר, המערכת מבקשת מהמשתמש לאשר או לדחות את בקשת הגישה.