लॉगिंग को समझना

संग्रह की मदद से व्यवस्थित रहें अपनी प्राथमिकताओं के आधार पर, कॉन्टेंट को सेव करें और कैटगरी में बांटें.

यह लेख लॉगिंग की प्रक्रिया को कवर करता है, जिसमें लॉग मानक, स्तर दिशानिर्देश, कक्षाएं, उद्देश्य और मल्टीस्टैक सन्निकटन शामिल हैं।

लॉग मानक

logcat में संयुक्त मानकों के मिश्रण के कारण एंड्रॉइड में लॉगिंग जटिल है। उपयोग किए गए मुख्य मानकों का विवरण नीचे दिया गया है:

स्रोत उदाहरण ढेर स्तर मार्गदर्शन
RFC 5424 ( syslog मानक) लिनक्स कर्नेल, कई यूनिक्स अनुप्रयोग कर्नेल, सिस्टम डेमॉन
android.util.Log एंड्रॉइड फ्रेमवर्क + एप्लिकेशन लॉगिंग एंड्रॉइड फ्रेमवर्क और सिस्टम एप्लिकेशन
java.util.logging.Level जावा में सामान्य लॉगिंग गैर-प्रणाली अनुप्रयोग

चित्र 1: लॉग स्तर मानक।

हालांकि इन मानकों में से प्रत्येक का समान स्तर का निर्माण है, वे ग्रैन्युलैरिटी में भिन्न हैं। मानकों में अनुमानित समकक्ष इस प्रकार हैं:

आरएफसी 5424 स्तर आरएफसी 5424 गंभीरता आरएफसी 5424 विवरण android.util.Log java.util.log.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."); }

संकलन समय पर R8 द्वारा ProGuard नियमसेट के माध्यम से प्रति-APK आधार पर लॉगिंग को हटाया जा सकता है। निम्न उदाहरण android.util.Log के लिए INFO स्तर लॉगिंग के नीचे सब कुछ हटा देता है:

# 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

यह कई एप्लिकेशन बिल्ड प्रकारों (उदाहरण के लिए, विकास बिल्ड बनाम रिलीज़ बिल्ड) को संभालने के लिए उपयोगी है, जहां अंतर्निहित कोड समान होने की उम्मीद है, लेकिन अनुमत लॉग स्तर अलग हैं। एप्लिकेशन (विशेष रूप से सिस्टम एप्लिकेशन) के लिए एक स्पष्ट नीति निर्धारित की जानी चाहिए और उसका पालन किया जाना चाहिए ताकि यह तय किया जा सके कि बिल्ड प्रकार और रिलीज अपेक्षाएं लॉग आउटपुट को कैसे प्रभावित करती हैं।

एंड्रॉइड रनटाइम (एआरटी) में सिस्टम लॉगिंग

सिस्टम अनुप्रयोगों और सेवाओं के लिए कई उपलब्ध वर्ग उपलब्ध हैं:

कक्षा उद्देश्‍य
android.telephony.Rlog रेडियो लॉगिंग
android.util.Log सामान्य अनुप्रयोग लॉगिंग
android.util.EventLog सिस्टम इंटीग्रेटर डायग्नोस्टिक इवेंट लॉगिंग
android.util.Slog प्लेटफ़ॉर्म फ्रेमवर्क लॉगिंग

चित्र 6: उपलब्ध सिस्टम लॉग क्लास और उद्देश्य।

हालाँकि android.util.Log और android.util.Slog समान लॉग स्तर मानकों का उपयोग करते हैं, @hide Slog है जो केवल प्लेटफ़ॉर्म द्वारा प्रयोग करने योग्य है। 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 रैपर इस प्रकार हैं:

आवरण वर्ग उदाहरण कार्य
log_main.h ALOGV , ALOGW
log_radio.h RLOGD , RLOGE
log_system.h SLOGI , SLOGW

चित्र 7: liblog रैपर।

एंड्रॉइड में लॉगिंग के लिए उच्च स्तर के इंटरफेस हैं जो प्रत्यक्ष liblog उपयोग के पक्षधर हैं, जैसा कि नीचे देखा गया है:

पुस्तकालय प्रयोग
async_safe पुस्तकालय केवल async-सिग्नल-सुरक्षित वातावरण से लॉगिंग के लिए
libbase लॉगिंग लाइब्रेरी जो लॉगिंग के लिए C++ स्ट्रीम इंटरफ़ेस प्रदान करती है, Google-शैली (glog) लॉगिंग के समान। 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: मानक जावा लॉगिंग बनाम एंड्रॉइड लॉगिंग में त्रुटि स्तर।

इस तरह के मामलों में, यह निर्धारित करने के लिए कि किस स्तर पर आवेदन करना है, व्यक्तिगत मानक का उपयोग करें।

एकाधिक स्टैक स्तर घटकों के साथ सिस्टम विकास के दौरान, प्रति-घटक का उपयोग करने के लिए कौन सा मानक निर्धारित करने के लिए चित्र 1 का पालन करें। टियर मैसेजिंग के अनुमानित गाइड के लिए, चित्र 2 का अनुसरण करें।

सुरक्षा और गोपनीयता

व्यक्तिगत रूप से पहचान योग्य जानकारी (PII) लॉग न करें। इसमें विवरण शामिल हैं जैसे:

  • ईमेल पता
  • टेलीफ़ोन नंबर
  • नाम

इसी तरह, कुछ विवरणों को संवेदनशील माना जाता है, भले ही वे स्पष्ट रूप से व्यक्तिगत रूप से पहचाने जाने योग्य न हों।

उदाहरण के लिए, हालांकि समयक्षेत्र की जानकारी को व्यक्तिगत रूप से पहचाने जाने योग्य नहीं माना जाता है, यह उपयोगकर्ता के अनुमानित स्थान का संकेत देता है।

लॉग पॉलिसी और स्वीकार्य विवरण को रिलीज से पहले सुरक्षा और गोपनीयता समीक्षा के हिस्से के रूप में संभाला जाना चाहिए।

डिवाइस लॉग

android.permission.READ_LOGS का उपयोग करने सहित सभी डिवाइस लॉग तक पहुंच प्रतिबंधित है:

  • यदि पृष्ठभूमि में कोई ऐप सभी डिवाइस लॉग तक पहुंच का अनुरोध करता है, तो अनुरोध स्वचालित रूप से अस्वीकार कर दिया जाता है जब तक कि ऐप:
    • सिस्टम यूआईडी साझा करता है।
    • एक मूल प्रणाली प्रक्रिया ( UID < APP_UID ) का उपयोग करता है।
    • DropBoxManager का उपयोग करता है।
    • केवल ईवेंट लॉग बफ़र तक पहुँचता है।
    • EventLog एपीआई का उपयोग करता है।
    • यंत्रीकृत परीक्षणों का उपयोग करता है।
  • यदि अग्रभूमि में कोई ऐप READ_LOGS के साथ डिवाइस लॉग तक पहुंच का अनुरोध करता है, तो सिस्टम उपयोगकर्ता को एक्सेस अनुरोध को स्वीकृत या अस्वीकार करने का संकेत देता है।