यह लेख लॉगिंग की प्रक्रिया को कवर करता है, जिसमें लॉग मानक, स्तर दिशानिर्देश, कक्षाएं, उद्देश्य और मल्टीस्टैक सन्निकटन शामिल हैं।
लॉग मानक
एंड्रॉइड में लॉगिंग logcat
में संयुक्त मानकों के मिश्रण के कारण जटिल है। उपयोग किए गए मुख्य मानकों का विवरण नीचे दिया गया है:
स्रोत | उदाहरण | ढेर स्तर मार्गदर्शन |
---|---|---|
RFC 5424 ( syslog मानक) | लिनक्स कर्नेल, कई यूनिक्स अनुप्रयोग | कर्नेल, सिस्टम डेमॉन |
android.util.Log | एंड्रॉइड फ्रेमवर्क + एप्लिकेशन लॉगिंग | एंड्रॉइड फ्रेमवर्क और सिस्टम एप्लिकेशन |
java.util.logging.Level | जावा में सामान्य लॉगिंग | गैर-सिस्टम अनुप्रयोग |
चित्र 1: लॉग स्तर मानक।
हालाँकि इनमें से प्रत्येक मानक का निर्माण समान स्तर का है, लेकिन वे ग्रैन्युलैरिटी में भिन्न हैं। सभी मानकों के अनुमानित समकक्ष इस प्रकार हैं:
आरएफसी 5424 स्तर | आरएफसी 5424 गंभीरता | आरएफसी 5424 विवरण | android.util.लॉग | java.util.लॉगिंग.स्तर |
---|---|---|---|---|
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; |
---|
संकलन समय पर R8
द्वारा प्रोगार्ड नियमसेट के माध्यम से प्रति-एपीके आधार पर लॉगिंग को हटाया जा सकता है। निम्नलिखित उदाहरण 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
समान लॉग स्तर मानकों का उपयोग करते हैं, Slog
एक @hide
वर्ग है जिसका उपयोग केवल प्लेटफ़ॉर्म द्वारा किया जा सकता है। EventLog
स्तर /system/etc/event-log-tags
में event.logtags
फ़ाइल की प्रविष्टियों में मैप किया जाता है।
मूल लॉगिंग
C/C++ में लॉगिंग लिनक्स कर्नेल syslog
के अनुरूप syslog
(2) के साथ syslog
मानक का पालन करता है जो printk
बफर को नियंत्रित करता है, और सामान्य सिस्टम लॉगर के अनुरूप syslog
(3)। एंड्रॉइड सामान्य सिस्टम लॉगिंग के लिए 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 | लॉगिंग लाइब्रेरी जो Google-शैली (ग्लॉग) लॉगिंग के समान, लॉगिंग के लिए C++ स्ट्रीम इंटरफ़ेस प्रदान करती है। libbase दोनों बाहरी परियोजनाओं में प्रयोग करने योग्य है और libbase_ndk उपयोग करने वाले अनुप्रयोगों में उपलब्ध है। |
चित्र 8: उच्च स्तरीय लॉग लाइब्रेरीज़।
मल्टीस्टैक अनुमान
ग्रैन्युलैरिटी और लेवल इंटेंट में अंतर के कारण, विभिन्न लॉगिंग मानकों का कोई स्पष्ट या सटीक मिलान नहीं है। उदाहरण के लिए, त्रुटि लॉग के लिए java.util.logging.Level
और android.util.Log
स्तर 1:1 मेल नहीं हैं:
java.util.लॉगिंग.स्तर | android.util.लॉग |
---|---|
गंभीर | Log.wtf |
गंभीर | Log.e |
चित्र 9: मानक जावा लॉगिंग बनाम एंड्रॉइड लॉगिंग में त्रुटि स्तर।
इस तरह के मामलों में, किस स्तर को लागू करना है यह निर्धारित करने के लिए व्यक्तिगत मानक का उपयोग करें।
एकाधिक स्टैक स्तर घटकों के साथ सिस्टम विकास के दौरान, प्रति-घटक किस मानक का उपयोग करना है यह निर्धारित करने के लिए चित्र 1 का पालन करें। टियर मैसेजिंग के लिए एक अनुमानित मार्गदर्शिका के लिए, चित्र 2 का अनुसरण करें।
सुरक्षा और गोपनीयता
व्यक्तिगत रूप से पहचान योग्य जानकारी (पीआईआई) लॉग न करें। इसमें विवरण शामिल हैं जैसे:
- ईमेल पते
- टेलीफ़ोन नंबर
- नाम
इसी तरह, कुछ विवरण संवेदनशील माने जाते हैं, भले ही वे स्पष्ट रूप से व्यक्तिगत रूप से पहचाने जाने योग्य न हों।
उदाहरण के लिए, हालांकि समय क्षेत्र की जानकारी को व्यक्तिगत रूप से पहचान योग्य नहीं माना जाता है, यह उपयोगकर्ता के अनुमानित स्थान का संकेत देता है।
लॉग नीति और स्वीकार्य विवरण को रिलीज से पहले सुरक्षा और गोपनीयता समीक्षा के हिस्से के रूप में संभाला जाना चाहिए।
डिवाइस लॉग
android.permission.READ_LOGS
का उपयोग करने सहित सभी डिवाइस लॉग तक पहुंच प्रतिबंधित है:
- यदि पृष्ठभूमि में कोई ऐप सभी डिवाइस लॉग तक पहुंच का अनुरोध करता है, तो अनुरोध स्वचालित रूप से अस्वीकार कर दिया जाता है जब तक कि ऐप:
- सिस्टम यूआईडी साझा करता है।
- एक मूल सिस्टम प्रक्रिया (
UID
<APP_UID
) का उपयोग करता है। -
DropBoxManager
उपयोग करता है। - केवल इवेंट लॉग बफ़र तक पहुँचता है।
-
EventLog
एपीआई का उपयोग करता है। - यंत्रीकृत परीक्षणों का उपयोग करता है।
- यदि अग्रभूमि में
READ_LOGS
वाला कोई ऐप डिवाइस लॉग तक पहुंच का अनुरोध करता है, तो सिस्टम उपयोगकर्ता को पहुंच अनुरोध को स्वीकृत या अस्वीकार करने का संकेत देता है।