इस लेख में, लॉग इन करने की प्रोसेस के बारे में बताया गया है. इसमें लॉग के स्टैंडर्ड, लेवल के लिए दिशा-निर्देश, क्लास, मकसद, और मल्टीस्टैक अनुमान.
लॉग स्टैंडर्ड
Android में लॉग इन करना मुश्किल है, क्योंकि कई तरह के स्टैंडर्ड इस्तेमाल किए जाते हैं, जो
logcat
में जुड़ा. इस्तेमाल किए गए मुख्य स्टैंडर्ड के बारे में नीचे बताया गया है:
Source | उदाहरण | स्टैक लेवल के लिए दिशा-निर्देश |
---|---|---|
RFC 5424 (syslog मानक) |
Linux कर्नेल, कई Unix ऐप्लिकेशन | कर्नेल, सिस्टम डीमन |
android.util.Log |
Android फ़्रेमवर्क + ऐप्लिकेशन लॉगिंग | Android फ़्रेमवर्क और सिस्टम ऐप्लिकेशन |
java.util.logging.Level |
जावा में सामान्य लॉगिंग | सिस्टम से बाहर का ऐप्लिकेशन |
पहली इमेज: लेवल के स्टैंडर्ड लॉग करें.
हालांकि, इन सभी मानकों का स्तर एक जैसा है, लेकिन इनमें अंतर अलग-अलग है जानकारी का स्तर. सभी स्टैंडर्ड के लिए, इनके बारे में यहां बताया गया है:
आरएफ़सी 5424 लेवल | आरएफ़सी 5424 की गंभीरता | आरएफ़सी 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 |
इन लॉग को कभी भी किसी ऐप्लिकेशन में कंपाइल नहीं किया जाता है. डेवलपमेंट. |
तीसरी इमेज: android.util.Log
CONFIG |
स्टैटिक कॉन्फ़िगरेशन मैसेज के लिए मैसेज का लेवल |
FINE |
मैसेज का लेवल, ट्रेस करने की जानकारी देने वाला |
FINER |
इससे पता चलता है कि ट्रेस करने वाला मैसेज काफ़ी बारीकी से दिखाया गया है |
FINEST |
यह बहुत ज़्यादा जानकारी वाले ट्रेसिंग मैसेज को दिखाता है |
INFO |
जानकारी देने वाले मैसेज के लिए मैसेज का लेवल |
SEVERE |
मैसेज के लेवल से पता चलता है कि कोई गंभीर गड़बड़ी हुई है |
WARNING |
मैसेज का लेवल, जो किसी संभावित समस्या की जानकारी देता है |
चौथी इमेज: java.util.Logging.Level
.
0 | आपातकालीन कॉल | सिस्टम काम नहीं कर रहा है |
1 | सूचना | कार्रवाई तुरंत की जानी चाहिए |
2 | सबसे अहम | गंभीर स्थितियां |
3 | कोई गड़बड़ी हुई | गड़बड़ी की शर्तें |
4 | चेतावनी | चेतावनी की शर्तें |
5 | सूचना | सामान्य, लेकिन अहम स्थिति |
6 | सूचनात्मक | जानकारी देने वाले मैसेज |
7 | डीबग | डीबग लेवल के मैसेज |
पांचवी इमेज: RFC 5424
- सेक्शन
6.2.1.
ऐप्लिकेशन में लॉग इन करना
Log#isLoggable
का इस्तेमाल करके, android.util.Log
क्लास TAG
की चुनिंदा लॉगिंग की जाती है,
जैसा कि नीचे दिखाया गया है:
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; |
---|
ProGuard के नियमसेट के ज़रिए, हर APK के हिसाब से लॉग करने की सेटिंग को 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 |
---|
यह एक से ज़्यादा तरह के ऐप्लिकेशन बनाने में मदद करता है ( उदाहरण के लिए, डेवलपमेंट बिल्ड बनाम रिलीज़ बिल्ड) जहां दिया गया कोड समान होने की उम्मीद है, लेकिन अनुमति वाले लॉग लेवल अलग-अलग हैं. एक्सप्लिसिट ऐप्लिकेशन (खास तौर पर सिस्टम) के लिए, इस नीति को सेट करना और उसका पालन करना ज़रूरी है ऐप्लिकेशन) का इस्तेमाल करके, यह तय किया जा सकेगा कि बिल्ड के टाइप और रिलीज़ की उम्मीदों से होने वाले बदलाव का लॉग पर क्या असर पड़ेगा आउटपुट.
Android रनटाइम (ART) में सिस्टम लॉग इन करना
ऐसे कई क्लास उपलब्ध हैं जो सिस्टम के लिए उपलब्ध हैं ऐप्लिकेशन और सेवाएं:
क्लास | मकसद |
---|---|
android.telephony.Rlog |
रेडियो लॉगिंग |
android.util.Log |
ऐप्लिकेशन में डेटा इकट्ठा करने की सामान्य सुविधा |
android.util.EventLog |
सिस्टम इंटिग्रेटर डाइग्नोस्टिक्स इवेंट लॉगिंग |
android.util.Slog |
प्लैटफ़ॉर्म के फ़्रेमवर्क को लॉग करना |
छठी इमेज: सिस्टम लॉग की उपलब्ध क्लास और उनके मकसद.
हालांकि, 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
के मुख्य रैपर इस तरह हैं:
रैपर क्लास | फ़ंक्शन के उदाहरण |
---|---|
log_main.h |
ALOGV , ALOGW |
log_radio.h |
RLOGD , RLOGE |
log_system.h |
SLOGI , SLOGW |
सातवीं इमेज: liblog
रैपर.
Android में लॉगिंग के लिए उच्च स्तरीय इंटरफ़ेस हैं जो प्रत्यक्ष की तुलना में ज़्यादा पसंद किए जाते हैं
liblog
का इस्तेमाल, जैसा कि यहां बताया गया है:
लाइब्रेरी | इस्तेमाल |
---|---|
async_safe |
सिर्फ़ एसिंक-सिग्नल-सुरक्षित वातावरण से लॉग करने के लिए लाइब्रेरी |
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: Android के मुकाबले, स्टैंडर्ड Java लॉगिंग में गड़बड़ी का लेवल लॉगिंग.
इस तरह के मामलों में, अलग-अलग मानक का इस्तेमाल करके यह तय करें कि
लागू करें.
एक से ज़्यादा स्टैक लेवल कॉम्पोनेंट के साथ सिस्टम डेवलपमेंट के दौरान, फ़ॉलो करें इमेज 1, ताकि यह तय किया जा सके कि हर कॉम्पोनेंट के लिए कौनसा स्टैंडर्ड इस्तेमाल करना है. करीब-करीब टियर मैसेज सेवा की गाइड के लिए, इमेज 2 को देखें.
सुरक्षा और निजता
व्यक्तिगत पहचान से जुड़ी जानकारी (पीआईआई) को लॉग न करें. यह इसमें यह जानकारी शामिल है:
- ईमेल पते
- टेलीफ़ोन नंबर
- नाम
इसी तरह, कुछ जानकारी को संवेदनशील माना जाता है, भले ही साफ़ तौर पर निजी तौर पर पहचाना जा सके.
उदाहरण के लिए, टाइमज़ोन की जानकारी को व्यक्तिगत पहचान नहीं माना जाता,
यह उपयोगकर्ता की जगह की अनुमानित जानकारी देता है.
लॉग नीति और स्वीकार की जाने वाली जानकारी को, सुरक्षा के तहत मैनेज किया जाना चाहिए और रिलीज़ से पहले निजता की समीक्षा की जा सकती है.
डिवाइस के लॉग
सभी डिवाइस लॉग का ऐक्सेस. इनमें, ये डिवाइस लॉग भी शामिल हैं:
android.permission.READ_LOGS
प्रतिबंधित है:
- अगर बैकग्राउंड में मौजूद कोई ऐप्लिकेशन सभी डिवाइस लॉग का ऐक्सेस मांगता है, तो अनुरोध अपने-आप अस्वीकार किया गया हो, जब तक कि ऐप्लिकेशन:
- सिस्टम का यूआईडी शेयर करता है.
- नेटिव सिस्टम प्रोसेस का इस्तेमाल करता है (
UID
<APP_UID
). DropBoxManager
का इस्तेमाल करता है.- सिर्फ़ इवेंट लॉग बफ़र को ऐक्सेस करता है.
EventLog
एपीआई का इस्तेमाल किया जाता है.- इंस्ट्रुमेंट्ड टेस्ट का इस्तेमाल किया जाता है.
- अगर फ़ोरग्राउंड में कोई ऐप्लिकेशन,
READ_LOGS
के साथ डिवाइस के लॉग को ऐक्सेस करने का अनुरोध करता है, तो सिस्टम, उपयोगकर्ता को ऐक्सेस का अनुरोध स्वीकार या अस्वीकार करने का प्रॉम्प्ट देता है.