आपको अपने ऐप के डेटा को लॉग करने के लिए लॉगर ओवर प्रिंट का उपयोग क्यों करना चाहिए।

May 04 2023
मुझे यकीन है कि आप में से कई लोगों को यह समस्या तब हुई होगी जब आप अपने कोड में कुछ लॉगिंग करते हैं और अचानक समस्या होना बंद हो जाती है क्योंकि आपने समय बदल दिया है। आप एक बहुत तेज़ लॉगिंग इंटरफ़ेस चाहते हैं जिसका आपके कोड पर न्यूनतम प्रभाव हो।

मुझे यकीन है कि आप में से कई लोगों को यह समस्या तब हुई होगी जब आप अपने कोड में कुछ लॉगिंग करते हैं और अचानक समस्या होना बंद हो जाती है क्योंकि आपने समय बदल दिया है। आप एक बहुत तेज़ लॉगिंग इंटरफ़ेस चाहते हैं जिसका आपके कोड पर न्यूनतम प्रभाव हो। और एक और बात जो आपको ध्यान में रखनी चाहिए वह है गोपनीयता।

Apple का एकीकृत लॉगिंग API, जिसे os_log के नाम से भी जाना जाता है, हमारे जीवन को आसान बनाता है। Apple ने 2016 में os_log और 2020 में लॉगर पेश किया । यदि डिवाइस आपके मैक से जुड़ा है, तो आप लॉग संदेशों को स्ट्रीम कर सकते हैं क्योंकि वे कंसोल ऐप में होते हैं। यदि आपका ऐप एक्सकोड से लॉन्च किया गया है, तो आप उन्हें एक्सकोड के कंसोल में भी देखेंगे। ऐप के चलने के बाद भी आप लॉग एकत्र कर सकते हैं।

जब आप इसे पुन: उत्पन्न नहीं कर सकते हैं तो यह बग को ठीक करने में आपकी सहायता करेगा

जब आपका ऐप किसी संदेश को लॉग करता है, तो ऑपरेटिंग सिस्टम उसे कंप्रेस्ड फॉर्म में डिवाइस पर स्टोर करता है। आप उन लॉग को पुनः प्राप्त करने के लिए अपने मैक पर "लॉग कलेक्ट" कमांड का उपयोग कर सकते हैं:

  1. अपने डिवाइस को अपने मैक से कनेक्ट करें
  2. डिवाइस विकल्प के साथ टर्मिनल से "लॉग कलेक्ट" कमांड चलाएँ। उस समय से प्रारंभ करें जब आपको लॉग की आवश्यकता हो और लॉग को संग्रहीत करने के लिए फ़ाइल नाम प्रदान करें।
  3. कंसोल ऐप में लॉग फ़ाइल खोलें। आप यहां लॉग ब्राउज़ और फ़िल्टर कर सकते हैं और समझ सकते हैं कि बग का कारण क्या था।

जब आप एक संरचना बनाते हैं Logger, तो आपके द्वारा लॉग किए गए सभी संदेशों में संदर्भ जोड़ने के लिए एक वैकल्पिक सबसिस्टम और श्रेणी स्ट्रिंग असाइन करें। एक सबसिस्टम आपके ऐप के एक बड़े कार्यात्मक क्षेत्र से मेल खाता है, और एक श्रेणी किसी विशेष सबसिस्टम के भीतर एक विशिष्ट क्षेत्र से मेल खाती है। समस्याओं का निदान करते समय, उन स्ट्रिंग्स का उपयोग असंबद्ध संदेशों को फ़िल्टर करने के लिए करें।

let logger = Logger(subsystem: "com.example.Wallet", category: "networking")

आप इन लॉग स्तरों से अपने संदेश का महत्व चुन सकते हैं। कंसोल ऐप में त्रुटि और गलती के स्तर को पीले और लाल बुलबुले के साथ हाइलाइट किया गया है।

logger.log(level: .error, "Network error")

डीबग: जारी नहीं रखा गया, जिसका अर्थ है कि ऐप के निष्पादन पूर्ण होने के बाद उन्हें पुनः प्राप्त नहीं किया जा सकता है।

जानकारी: अधिकांशतः बनी नहीं रहती, सिवाय इसके कि जब वे लॉग कलेक्ट कमांड से कुछ क्षण पहले उत्पन्न होते हैं।

हर दूसरे स्तर पर लॉग किए गए संदेश बने रहते हैं, और आप उन्हें बाद में पुनः प्राप्त कर सकते हैं।

हालाँकि, कितने संदेशों को संग्रहीत करने की एक संग्रहण सीमा है। एक बार जब यह सीमा पार हो जाती है, तो पुराने मिटा दिए जाते हैं और अनुपलब्ध हो जाते हैं। त्रुटि और दोष स्तर के संदेश नोटिस स्तर के संदेशों से भी लंबे समय तक बने रहते हैं। आमतौर पर, संदेश कुछ दिनों तक बने रहेंगे। हालाँकि, यह आपके डिवाइस पर स्टोरेज स्पेस पर निर्भर करता है।

आपको जो बात ध्यान में रखनी चाहिए: लॉग स्तर भी प्रदर्शन को प्रभावित करते हैं।

भले ही सामान्य रूप से लॉगिंग में ओवरहेड कम होता है, लॉग स्तरों का एक दूसरे के सापेक्ष अलग-अलग प्रदर्शन होता है। जो स्तर कम महत्वपूर्ण हैं वे तेज़ हैं। गलती का स्तर सबसे धीमा है, और डिबग स्तर सबसे अधिक प्रदर्शनकारी है।

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

गोपनीयता

लॉग में डेटा की दृश्यता को नियंत्रित करने के लिए आप गोपनीयता विकल्पों का उपयोग कर सकते हैं। लॉग किए गए डेटा की गोपनीयता को गंभीरता से लेना वास्तव में महत्वपूर्ण है। ऐसा इसलिए है क्योंकि लॉगिंग हर समय होती रहती है, भले ही आपका ऐप भेज दिया गया हो और आपके उपयोगकर्ताओं के हाथों में हो। लॉग किसी के द्वारा भी एकत्र किए जा सकते हैं, जिसके पास डिवाइस तक भौतिक पहुंच है और इसका पासकोड भी है। इसलिए, यह महत्वपूर्ण है कि लॉग संदेश किसी भी व्यक्तिगत जानकारी को सार्वजनिक रूप से चिह्नित न करें, जो इसे लॉग में उजागर कर सके। आप हैश फ़ंक्शन के साथ .private भी चुन सकते हैं, इससे आपको यह देखने में मदद मिलेगी कि दो संदेश उनके मूल्यों को प्रकट किए बिना कब बराबर होते हैं।

logger.log("Request: \(request.body, privacy: .private)")
logger.log("Account Number: \(accountNumber, privacy: .private(mask: .hash))")

आप संदेश में रनटाइम डेटा लॉग कर सकते हैं। प्रिंट के विपरीत, लॉग संदेश पूरी तरह से एक स्ट्रिंग में परिवर्तित नहीं होता है, क्योंकि यह बहुत धीमा होगा। इसके बजाय, कंपाइलर और लॉगिंग लाइब्रेरी एक साथ काम करते हैं ताकि लॉग संदेश का अत्यधिक अनुकूलित प्रतिनिधित्व तैयार किया जा सके जो लॉग डेटा के प्रकार का लाभ उठाता है। अनुकूलित प्रतिनिधित्व के साथ, आप लॉग संदेश वास्तव में प्रदर्शित होने पर केवल एक स्ट्रिंग में कनवर्ट करने की लागत का भुगतान करते हैं। लॉग संदेशों में विभिन्न प्रकार के डेटा प्रकार हो सकते हैं। आप संख्यात्मक प्रकार जैसे Int और Double, Objective-C ऑब्जेक्ट, साथ ही स्विफ्ट के CustomStringConvertible प्रोटोकॉल के अनुरूप किसी भी प्रकार को लॉग कर सकते हैं। इसका मतलब है कि अपने स्वयं के प्रकार को लॉग संदेश में जोड़ना है, आपको बस इतना करना है कि इसे CustomStringConvertible के अनुरूप बनाएं।

का प्रारूपण

आप डेटा को प्रारूपित करने के लिए वैकल्पिक "प्रारूप" और "संरेखित" पैरामीटर का उपयोग कर सकते हैं। चूंकि लॉगिंग एपीआई का उपयोग करके डेटा को स्वरूपित करने से लॉग कॉल की लागत नहीं बढ़ती है, आप अपने डेटा को सुंदर और समझने में आसान बनाने के लिए जितना चाहें उतना प्रारूपण का उपयोग कर सकते हैं।

आप एक्सकोड के कोड पूरा होने का उपयोग करके विकल्पों की पूरी श्रृंखला देख सकते हैं, जिसमें हेक्साडेसिमल, ऑक्टल, एक्सपोनेंशियल और अन्य के रूप में स्वरूपण संख्याएं शामिल हैं।

लॉगर ओवर प्रिंट का उपयोग करने के लाभ गोपनीयता, स्ट्रिंग इंटरपोलेशन, कम प्रदर्शन ओवरहेड, विभिन्न उपयोग के लिए विभिन्न लॉगिंग स्तर, बिना किसी लागत के स्वरूपण, आसान फ़िल्टरिंग और दृढ़ता हैं।