डेटा इकट्ठा करने के तरीके के बारे में जानकारी

इस लेख में, लॉग इन करने की प्रोसेस के बारे में बताया गया है. इसमें लॉग के स्टैंडर्ड, लेवल के लिए दिशा-निर्देश, क्लास, मकसद, और मल्टीस्टैक अनुमान.

लॉग स्टैंडर्ड

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;

… If (DEBUG) { Log.v("FOO_TAG", "Extra debug logging."); }

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 के साथ डिवाइस के लॉग को ऐक्सेस करने का अनुरोध करता है, तो सिस्टम, उपयोगकर्ता को ऐक्सेस का अनुरोध स्वीकार या अस्वीकार करने का प्रॉम्प्ट देता है.