TRACE का स्तर क्यों मौजूद है, और मुझे DEBUG के बजाय इसका उपयोग कब करना चाहिए?


82

Log4J, Slf4J और जावा में कुछ अन्य लॉगिंग फ्रेमवर्क में, आपके पास लॉगिंग के लिए दो "डेवलपपर" स्तर हैं:

  • डीबग
  • ट्रेस

मैं समझता हूं कि DEBUG क्या करता है, क्योंकि स्पष्टीकरण स्पष्ट है:

DEBUG स्तर ठीक-ठीक सूचनात्मक घटनाओं को नामित करता है जो किसी एप्लिकेशन को डीबग करने के लिए सबसे उपयोगी होते हैं।

लेकिन इसके उपयोग के मामले के बारे में TRACE का स्तर बहुत विशिष्ट नहीं है:

TRACE Level DEBUG की तुलना में बारीक-बारीक सूचनात्मक घटनाओं को नामित करता है

(स्रोत: log4J JavaDoc )

यह मुझे नहीं बताता कि कैसे या कब TRACE का उपयोग करना है। दिलचस्प बात यह है कि, यह एक गंभीरता स्तर नहीं है जो कि syslog मानक में परिभाषित किया गया है । TRACE और DEBUG के बीच अंतर के लिए गुगली केवल "DEBUG, ओह का उपयोग करें, और TRACE भी है" वापस आती है। मुझे TRACE के स्तर के लिए एक विशिष्ट उपयोग का मामला नहीं मिला। सबसे अच्छा मैं पा सकता था यह स्तर के अस्तित्व की योग्यता पर बहस करने वाला पुराना विकी पृष्ठ था ।

यह, एक वास्तुकार के रूप में, मेरे सिर में बहुत सारे झंडे और सवाल उठाता है। यदि एक युवा डेवलपर ने मुझे अपनी वास्तुकला में TRACE जोड़ने के लिए कहा, तो मैं उसे सवालों के साथ बमबारी करूंगा:

  • जानकारी के कुछ उदाहरण हैं जिन्हें TRACE के साथ लॉग किया जाना चाहिए और DEBUG के साथ नहीं होना चाहिए?
  • उस जानकारी को लॉग करके मैं किस विशिष्ट समस्या का समाधान करूं?
  • उन उदाहरणों में, लॉग की गई जानकारी के गुण क्या हैं जो स्पष्ट रूप से DEASUG स्तर के बजाय TRACE के स्तर पर लॉगिंग के बीच भेदभाव करते हैं?
  • लॉग इंफ्रास्ट्रक्चर के माध्यम से उस जानकारी को क्यों जाना चाहिए?
    • केवल उपयोग करने के बजाय एक लॉग पत्रिकाओं में उस जानकारी को बनाए रखने के क्या लाभ हैं System.out.println?
    • डिबगर के बजाय इसके लिए लॉग का उपयोग करना बेहतर क्यों है?
  • TRACE के स्तर पर लॉगिंग का एक विहित उदाहरण क्या होगा?
    • उदाहरण में DEBUG के बजाय TRACE के स्तर पर प्रवेश करके क्या विशिष्ट लाभ अर्जित किए गए हैं?
    • वे लाभ महत्वपूर्ण क्यों हैं?
    • रिवर्स में: मुझे DEBUG के बजाय TRACE पर लॉग इन करके किन समस्याओं से बचना था?
    • मैं उन समस्याओं को कैसे हल कर सकता हूं? उन अन्य समाधानों की तुलना में TRACE के स्तर पर प्रवेश क्यों बेहतर है?
  • क्या उत्पादन कोड में TRACE स्तर का लॉग स्टेटमेंट छोड़ा जाना चाहिए? क्यों?

लेकिन यह देखते हुए कि यह सबसे प्रमुख ढांचे में मौजूद है, मुझे लगता है कि यह कुछ के लिए उपयोगी है? तो ... क्या TRACE के लिए है, और क्या यह DEBUG से अलग करता है?


वहां अत्यधिक हैं '?' उपरोक्त प्रश्न में। मैं दृढ़ता से प्रश्न को एक पहलू तक सीमित करने का सुझाव दूंगा जो पूरी तरह से उत्तर दिया जा सकता है (कई आंशिक उत्तरों के बजाय)।


2
खैर, मैं वास्तव में लॉगिंग के बारे में सामान्य जानकारी नहीं मांग रहा हूं। मैं बस समझना चाहता हूं कि TRACE का स्तर क्यों मौजूद है, और मुझे कब इसका उपयोग करना चाहिए।
लॉरेंट बोर्गुल्ट-रॉय

3
@gnat मैंने आपके द्वारा डुप्लिकेट के रूप में चिह्नित किए गए प्रश्न की जाँच की, और कहीं यह TRACE के उपयोग के मामले की व्याख्या नहीं करता है। मैं विनम्रतापूर्वक पूछना चाहता हूं कि डुप्लिकेट ध्वज को हटा दिया जाए। (जब तक मैंने इसे आपके द्वारा जुड़े प्रश्न में याद नहीं किया?)
लॉरेंट बोर्गुल्ट-रॉय

1
@sd यह log4J 1.2 प्रलेखन से है, मैंने अपने प्रश्न में स्रोत जोड़ा है।
लॉरेंट बॉरगुल्ट-रॉय

जवाबों:


59

उन सूचनाओं का उदाहरण क्या है जो TRACE के साथ लॉग इन होनी चाहिए और DEBUG के साथ नहीं होनी चाहिए?

अगर मेरे पास एक एल्गोरिथ्म है जो चरणों के एक समूह से गुजरता है, तो ट्रेस स्तर बेहतरीन स्तर पर उनमें से प्रत्येक चरण के बारे में जानकारी प्रिंट करेगा। हर कदम के शाब्दिक इनपुट और आउटपुट जैसी चीजें।

सामान्य तौर पर, ट्रेस में सभी डीबग शामिल होंगे (जैसे डीबग में सभी चेतावनी और त्रुटियां शामिल हैं)।

उस जानकारी को लॉग करके मैं किस विशिष्ट समस्या का समाधान करूं?

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

उन उदाहरणों में, लॉग की गई जानकारी के गुण क्या हैं जो स्पष्ट रूप से DEASUG स्तर के बजाय TRACE के स्तर पर लॉगिंग के बीच भेदभाव करते हैं?

सामान्य तौर पर, ट्रेस स्तर लॉगिंग निरंतर अवधि के लिए नहीं हो सकता है क्योंकि यह एप्लिकेशन के प्रदर्शन को बहुत कम कर देता है, और / या लॉग डेटा की एक बहुतायत बनाता है जो डिस्क / बैंडविड्थ की कमी के कारण अस्थिर है।

डिबग स्तर लॉगिंग आमतौर पर ऐप को अनुपयोगी बनाने के बिना लंबी अवधि के लिए हो सकता है।

लॉग इंफ्रास्ट्रक्चर के माध्यम से उस जानकारी को क्यों जाना चाहिए?

यह करने के लिए नहीं है। कुछ चौखटों में एक अलग ट्रेजरोगर होता है।

आमतौर पर लॉग में यह समाप्त हो जाता है क्योंकि ट्रैसलोगर्स और सामान्य लॉगर में डिस्क / नेटवर्क पर लिखने, त्रुटि से निपटने, लॉग रोटेशन आदि के संबंध में समान आवश्यकताएं होती हैं।

डिबगर के बजाय इसके लिए लॉग का उपयोग करना बेहतर क्यों है?

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

लेकिन वे सिर्फ नाम हैं। किसी भी अन्य लेबल की तरह, वे केवल उन लोगों के नाम हैं जो चीजों पर लगाए गए हैं, और आमतौर पर अलग-अलग लोगों के लिए अलग-अलग चीजों का मतलब होगा। और लेबल स्वयं उन भावपूर्ण बिट्स की तुलना में कम महत्वपूर्ण है जिन्हें लेबल संदर्भित करता है।


3
"प्रदर्शन" पहलू वास्तव में मुझे समझने में मदद करता है। धन्यवाद!
लॉरेंट बॉर्गुल्ट-रॉय

6
मैं जोड़ूंगा कि ट्रेसिंग का उपयोग उन जगहों पर किया जा सकता है जहां एक ब्रेकपॉइंट डीबगर सही कोड निष्पादन के साथ हस्तक्षेप करेगा, जैसे कि बाधा हैंडलर, टाइमर, और कसकर युग्मित बहु-थ्रेडेड कोड।
andy256

@ @y256 - मेरे अनुभव में, ट्रेस लेवल लॉगिंग उस तरह के सामान को भी बाधित करता है।
तेलेस्टाइन

@ टेलस्टाइन हाँ, यह निश्चित रूप से कर सकता है। सिस्टम सहिष्णुता पर कितना निर्भर करता है। एक इंजीनियर को उपलब्ध उपकरणों को समझना चाहिए और नौकरी के लिए सही चयन करना चाहिए।
andy256

15

विशेष ध्यान दें कि slf4j विशेष रूप से ट्रेस का उपयोग करने के खिलाफ सिफारिश करता है ( http://slf4j.org/faq.html#trace ):

संक्षेप में, हालाँकि हम अभी भी TRACE के स्तर के उपयोग को हतोत्साहित करते हैं क्योंकि विकल्प मौजूद हैं या क्योंकि कई मामलों में लॉग स्तर TRACE का अनुरोध बेकार है, यह देखते हुए कि लोग इसके लिए पूछते रहे, हमने लोकप्रिय मांग के लिए झुकने का फैसला किया।

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

आम तौर पर, मुझे लगता है कि ट्रेस आमतौर पर अन्य दृष्टिकोणों की तुलना में अधिक प्रयास है।


1
चरम में, ट्रेस स्तर लॉगिंग पूरे निष्पादन में कार्यक्रम की पूर्ण स्थिति का एक प्रतिलिपि प्रस्तुत करने योग्य, प्रतिवर्ती लॉग (डेटाबेस के लेनदेन लॉग की शैली में) प्रदान कर सकता है। वह सब कुछ ट्रेस कर रहा है , या कम से कम सब कुछ प्रक्रिया में है :-)
स्टीव जेसप

13

सामान्य रूप से डिबग का स्तर पूरी तरह से मनमाना है और भाषाओं, पुस्तकालयों और कंपनियों के बीच भिन्न हो सकता है।

कहा जा रहा है, यहाँ है कि मैंने उन्हें किस तरह से देखा है:

TRACE: तर्क-स्तर के कार्यक्रम प्रवाह को दिखाने के लिए उपयोग किया जाता है। एक समारोह में प्रवेश किया? क्या "यदि" कथन मुख्य या "अन्य" शाखा का चयन करता है? यह ट्रेस के लिए एक उम्मीदवार है। दूसरे शब्दों में, ट्रेस लॉगिंग आमतौर पर "आप यहाँ हैं" को निर्दिष्ट करने के लिए उपयोग किया जाता है। यह अन्य लॉगिंग स्टेटमेंट के संदर्भ में उपयोगी है जो किसी त्रुटि या अन्य जानकारी को लॉग कर सकता है। ट्रेस लॉगिंग एक अलग स्तर पर लॉग की गई त्रुटि या अन्य घटना के कोड में, स्थान को इंगित करने में मदद कर सकती है।

DEBUG: चर राज्य, विशिष्ट त्रुटि कोड आदि को डंप करने के लिए उपयोग किया जाता है। उदाहरण के लिए: एक वेब सेवा त्रुटि कोड 809214 लौटा सकती है, जिसे लॉग किया जा सकता है, जबकि एप्लिकेशन उपयोगकर्ता को "संचार विफल" बताता है। एक डेवलपर की कल्पना करें कि त्रुटि होने के लंबे समय बाद उपयोगकर्ता के सिस्टम से लॉग प्राप्त होता है और सोचता है कि " विफलता क्यों हुई ?" यह डिबग स्तर पर लॉग इन करने के लिए एक अच्छी बात है। एक अन्य उदाहरण यह हो सकता है कि यदि कोई बग उत्पादन में घटित हो रहा है, लेकिन पुन: उत्पन्न करने के लिए कठिन है, तो डिबग लॉग में कुछ चर या घटनाओं को समस्याग्रस्त मॉड्यूल में मदद करने के लिए डेवलपर्स को कार्यक्रम की स्थिति बताने में मदद करने के लिए जब त्रुटि समस्या निवारण में होती है।

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

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

इस पर कोई वास्तविक सीमाएं नहीं हैं, कोई नियम नहीं कहता है कि आपको एक निश्चित तरीके से लॉग इन करना है। केवल व्यापक सम्मेलन जो कुछ पुस्तकालयों या अनुप्रयोगों का पालन कर सकते हैं या नहीं कर सकते हैं।


9

मुझे लगता है कि तेलस्टीन के उत्कृष्ट जवाब को मेरे अंगूठे के छोटे नियम के रूप में संक्षेपित किया जा सकता है:

  • DEBUG लॉगिंग को उत्पादन में उपयोग करने में सक्षम होना चाहिए (लेकिन अभी भी सामान्य रूप से बंद हो जाता है)
  • TRACE लॉगिंग को ऐसा करने की अनुमति है जो उत्पादन में इसका उपयोग करता है (विशिष्ट / लघु सत्र के अलावा) अनम्य है

6

यहाँ 'अंगूठे का मेरा नियम

error   you need        to do something
warn    you might need  to do something
info    you need        to log this in production
debug   you might need  to log this in production
trace   everything that is happening (no performance concerns)

इसके पीछे धारणा यह है कि ऑप्स टीम करेगी

  • लॉग-स्तरीय जानकारी के लिए हमेशा उत्पादन सेट होता है
  • लॉग-लेवल डीबग के लिए उत्पादन सेट हो सकता है
  • लॉग-लेवल ट्रेस में कभी भी उत्पादन सेट नहीं होता है

इस धारणा के साथ, यहां बताया गया है कि आप, डेवलपर के रूप में, लॉग स्तरों का उपयोग कैसे कर सकते हैं ...

समस्या # 1) उत्पादन प्रदर्शन को बहुत अधिक धीमा नहीं करना

debugहल # 1। यह आप है, डेवलपर के रूप में, जानकारी को संतुलित करने के लिए अपना सर्वश्रेष्ठ प्रयास करते हुए आपको उत्पादन में बहुत अधिक शोर के साथ उत्पादन की आवश्यकता हो सकती है। आप कह रहे हैं "उत्पादन में इसे लगातार लॉग करना एक अच्छा विचार है (यदि आप चाहते हैं)।"

समस्या # 2) विकसित करते समय क्रियात्मक जानकारी होना

traceसमस्या हल करती है # 2। आपको बिल्कुल चिंता नहीं है कि उत्पादन मशीन पर इसका क्या प्रभाव पड़ेगा, लेकिन कोड विकसित करते समय आपको अभी उस जानकारी की आवश्यकता है। आप कह रहे हैं "मैं कोई वादा नहीं करता कि उत्पादन में इस जानकारी को हमेशा लॉग इन करना एक अच्छा विचार है।"


दी गई (जैसा कि अन्य ने कहा है), ये बातें मनमानी हैं; इसलिए बस यह सुनिश्चित करें कि आपकी विकास टीम (और ऑप्स / मॉनिटरिंग टीम - क्योंकि वे आपके लॉगिंग के उपयोगकर्ता भी हैं) किसी बात पर सहमत हैं।


2

TRACE के स्तर पर लॉगिंग का एक विहित उदाहरण क्या होगा?

ENTRY / EXIT एक विधि से लॉग होता है। ये लॉग आपको कार्यक्रम के प्रवाह का पता लगाने में मदद करते हैं और जब बहुत उपयोगी होते हैं:

  1. कार्यक्रम अचानक दुर्घटनाग्रस्त हो जाता है - आपको पता है कि लॉग की अंतिम पंक्ति को देखकर वास्तव में कौन सा फ़ंक्शन क्रैश हो गया है

  2. कुछ दुष्ट कार्य चुपचाप एक अपवाद को अवशोषित करके विफल हो जाते हैं

वे केवल DEBUG का उपयोग करने के बजाय एक अलग TRACE स्तर का वारंट करते हैं क्योंकि आपके कोड बेस में हर विधि के लिए ENTRY / EXIT लॉग को सक्षम करने से अतिरिक्त लॉग्स की जबरदस्त मात्रा उत्पन्न होने वाली है जो हमेशा DEBUG के संदर्भ में भी अनुचित होती है ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.