.net शिक्षार्थी - सर्वोत्तम प्रथाओं को लॉगिंग




केंद्रित पाठ्यक्रम (9)

मैं वास्तविक अनुप्रयोगों में ट्रेसिंग और लॉगिंग को संभालने के तरीकों पर कहानियां प्राप्त करना चाहता हूं। यहां कुछ प्रश्न दिए गए हैं जो आपके उत्तर को समझाने में मदद कर सकते हैं।

फ़्रेमवर्क

आप किस ढांचे का उपयोग करते हैं?

  • log4net
  • System.Diagnostics.Trace
  • System.Diagnostics.TraceSource
  • लॉगिंग आवेदन ब्लॉक
  • अन्य?

यदि आप ट्रेसिंग का उपयोग करते हैं, तो क्या आप Trace.Correlation.StartLogicalOperation का उपयोग करते हैं?

क्या आप इस कोड को मैन्युअल रूप से लिखते हैं, या आप इसे करने के लिए पहलू उन्मुख प्रोग्रामिंग के कुछ रूपों का उपयोग करते हैं? एक कोड स्निपेट साझा करने के लिए देखभाल?

क्या आप ट्रेस स्रोतों पर ग्रैन्युलरिटी का कोई भी रूप प्रदान करते हैं? उदाहरण के लिए, डब्ल्यूपीएफ ट्रेस स्रोत आपको विभिन्न स्तरों पर कॉन्फ़िगर करने की अनुमति देता है:

  • System.Windows - सभी WPF के लिए सेटिंग्स
  • System.Windows.Animation - विशेष रूप से एनीमेशन के लिए ओवरराइड करें।

श्रोताओं

आप किस लॉग आउटपुट का उपयोग करते हैं?

  • पाठ फाइलें
  • एक्सएमएल फाइलें
  • इवेंट लोग
  • अन्य?

यदि फाइलों का उपयोग करते हैं, तो क्या आप रोलिंग लॉग या सिर्फ एक फ़ाइल का उपयोग करते हैं? लोगों के उपभोग के लिए आप लॉग कैसे उपलब्ध कराते हैं?

देखना

लॉग देखने के लिए आप किस टूल्स का उपयोग करते हैं?

  • नोटपैड
  • पूंछ
  • घटना दर्शक
  • सिस्टम सेंटर ऑपरेशंस मैनेजर / माइक्रोसॉफ्ट ऑपरेशंस मैनेजर
  • डब्ल्यूसीएफ सेवा ट्रेस व्यूअर
  • अन्य?

यदि आप एएसपी.नेट समाधान बना रहे हैं, तो क्या आप एएसपी.नेट स्वास्थ्य निगरानी का भी उपयोग करते हैं? क्या आप स्वास्थ्य मॉनीटर घटनाओं में ट्रेस आउटपुट शामिल करते हैं? Trace.axd के बारे में क्या?

कस्टम प्रदर्शन काउंटर के बारे में क्या?


Answers

उत्तरों में बहुत सारी महान सिफारिशें हैं।

एक सामान्य सर्वोत्तम अभ्यास यह विचार करना है कि लॉग कौन पढ़ेगा। मेरे मामले में यह ग्राहक साइट पर एक प्रशासक होगा। तो मैं उन संदेशों को लॉग करता हूं जो उन्हें कुछ देता है जो वे कार्य कर सकते हैं। उदाहरण के लिए, "एप्लिकेशन प्रारंभ करने में असमर्थ। यह आमतौर पर ...... के कारण होता है"


आप किस ढांचे का उपयोग करते हैं?

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

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

जटिल व्यावसायिक अनुक्रमों में विफलताओं को डीबग करने का प्रयास करते समय यह कुछ बार उपयोगी साबित हुआ है क्योंकि यह हमें गतिविधि निष्पादन अनुक्रम के आधार पर अधिक तेज़ी से if / Else शाखा निर्णय आदि निर्धारित करने की अनुमति देता है।

आप किस लॉग आउटपुट का उपयोग करते हैं?

हम टेक्स्ट फाइलों और एक्सएमएल फाइलों का उपयोग करते हैं। टेक्स्ट फ़ाइलों को ऐप ब्लॉक के माध्यम से कॉन्फ़िगर किया गया है लेकिन हमारे पास हमारे डब्ल्यूएफ सेवा से एक्सएमएल आउटपुट भी हैं। यह हमें रनटाइम घटनाओं (दृढ़ता आदि) के साथ-साथ सामान्य व्यापार प्रकार अपवादों को पकड़ने में सक्षम बनाता है। टेक्स्ट फाइलें रोलिंग लॉग हैं जो दिन और आकार के आधार पर लुढ़कती हैं (मेरा मानना ​​है कि 1 एमबी का कुल आकार रोलओवर पॉइंट है)।

लॉग देखने के लिए आप किस टूल्स का उपयोग करते हैं?

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

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


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

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

लॉगर का हमारा अवतार एक उदाहरण के साथ परिभाषित कई उदाहरणों को अनुमति देता है। हम अलग-अलग लॉगिंग स्तर वाले किसी भी बच्चे लॉगर्स को तुरंत चालू कर सकते हैं, लेकिन इस आर्किटेक्चर का सबसे उपयोगी पहलू लॉगिंग गुणों को बदलकर व्यक्तिगत पैकेज और कक्षाओं के लिए लॉगर्स बनाने की क्षमता है। पाठ संख्या दो एक लचीली प्रणाली बनाना है जो कोड बदलने के बिना अपने व्यवहार को ओवरराइड करने की अनुमति देता है।

हम Log4J के चारों ओर लिपटे अपाचे कॉमन्स-लॉगिंग लाइब्रेरी का उपयोग कर रहे हैं।

उम्मीद है की यह मदद करेगा!

* संपादित करें *

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


लॉग लॉग उदाहरण के लिए एक सिंगलटन रैपर के साथ लॉगिंग प्रदाता के रूप में हम लॉग 4नेट का उपयोग करते हैं (हालांकि सिंगलटन समीक्षा अधीन है, यह पूछताछ कर रहा है कि वे एक अच्छा विचार हैं या नहीं)।

हमने इसे निम्नलिखित कारणों से चुना है:

  • विभिन्न वातावरण पर सरल विन्यास / पुनर्गठन
  • प्री-बिल्ट एपेंडर की अच्छी संख्या
  • सीएमएस के हममें से एक का उपयोग पहले से ही किया गया था
  • उनके चारों ओर लॉग स्तर और विन्यास की अच्छी संख्या

मुझे जिक्र करना चाहिए, यह एक एएसपी.नेट विकास दृष्टिकोण से बात कर रहा है

मैं .NET ढांचे में ट्रेस का उपयोग करने में कुछ योग्यता देख सकता हूं लेकिन मुझे पूरी तरह से बेचा नहीं जाता है, मुख्य रूप से क्योंकि जिन घटकों के साथ मैं काम करता हूं वे वास्तव में कोई ट्रेस कॉल नहीं करते हैं। एकमात्र चीज जिसे मैं अक्सर उपयोग करता हूं वह है System.Net.Mail जो मैं बता सकता हूं।

तो हमारे पास एक लाइब्रेरी है जो log4net को लपेटती है और हमारे कोड में हमें बस इस तरह की चीजों की आवश्यकता होती है:

Logger.Instance.Warn("Something to warn about");
Logger.Instance.Fatal("Something went bad!", new Exception());

try {
  var i = int.Parse("Hello World");
} catch(FormatException, ex) {
  Logger.Instance.Error(ex);
}

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

Logger.Instance.Debug(string.Format("Something to debug at {0}", DateTime.Now);

यह बन जाएगा:

if(Logger.DebugEnabled) Logger.Instance.Debug(string.Format("Something to debug at {0}", DateTime.Now);

(निष्पादन समय का थोड़ा सा बचाओ)

डिफ़ॉल्ट रूप से हम दो स्थानों पर लॉग ऑन करते हैं:

  1. वेबसाइट की फाइल सिस्टम (एक गैर-सेवा फ़ाइल एक्सटेंशन में)
  2. त्रुटि और घातक के लिए ईमेल भेजना

फाइलें प्रत्येक दिन या 10 एमबी (आईआईआरसी) के रोलिंग के रूप में की जाती हैं। हम EventLog का उपयोग नहीं करते हैं क्योंकि हम अक्सर एक साइट देना चाहते हैं की तुलना में उच्च सुरक्षा की आवश्यकता हो सकती है।

मुझे लगता है कि नोटपैड लॉग पढ़ने के लिए ठीक काम करता है।


अद्यतन: सिस्टम के लिए एक्सटेंशन के लिए। डायग्नोस्टिक्स, कुछ लापता श्रोताओं को प्रदान करना जो आप चाहते हैं, आवश्यक देखें। CodePlex ( http://essentialdiagnostics.codeplex.com/ ) पर आवश्यक। डायग्नोस्टिक्स

फ़्रेमवर्क

प्रश्न: आप किस ढांचे का उपयोग करते हैं?

ए: System.Diagnostics.TraceSource, .NET 2.0 में बनाया गया।

यह अनुप्रयोगों के लिए शक्तिशाली, लचीला, उच्च प्रदर्शन लॉगिंग प्रदान करता है, हालांकि कई डेवलपर इसकी क्षमताओं से अवगत नहीं हैं और उनका पूरा उपयोग नहीं करते हैं।

ऐसे कुछ क्षेत्र हैं जहां अतिरिक्त कार्यक्षमता उपयोगी होती है, या कभी-कभी कार्यक्षमता मौजूद होती है लेकिन अच्छी तरह से प्रलेखित नहीं होती है, हालांकि इसका मतलब यह नहीं है कि संपूर्ण लॉगिंग फ्रेमवर्क (जो एक्स्टेंसिबल होने के लिए डिज़ाइन किया गया है) को फेंक दिया जाना चाहिए और कुछ लोकप्रिय विकल्पों की तरह पूरी तरह बदल दिया जाना चाहिए (एनएलओजी, लॉग 4नेट, कॉमन। लॉजिंग, और यहां तक ​​कि एंटीलिब लॉगिंग)।

अपने आवेदन में लॉगिंग स्टेटमेंट जोड़ने और पहिया को फिर से आविष्कार करने के तरीके को बदलने के बजाय, बस कुछ जगहों पर सिस्टम। डायग्नोस्टिक्स फ्रेमवर्क को बढ़ाएं।

ऐसा लगता है कि मुझे अन्य ढांचे, यहां तक ​​कि एंटीलिब, यहां तक ​​कि यहां सिंड्रोम की खोज नहीं की गई है, और मुझे लगता है कि उन्होंने मूलभूत बातें फिर से आविष्कार की है जो सिस्टम में पूरी तरह से अच्छी तरह से काम कर रही हैं। डायग्नोस्टिक्स (जैसे कि आप लॉग स्टेटमेंट कैसे लिखते हैं) मौजूद कुछ अंतराल भरने के बजाय। संक्षेप में, उनका उपयोग न करें - उनकी आवश्यकता नहीं है।

विशेषताएं जिन्हें आप नहीं जानते थे:

  • एक प्रारूप स्ट्रिंग और तर्क लेने वाले TraceEvent अधिभार का उपयोग करके प्रदर्शन में मदद मिल सकती है क्योंकि फ़िल्टर के बाद पैरामीटर को अलग-अलग संदर्भों के रूप में रखा जाता है। ShouldTrace () सफल हो गया है। इसका मतलब पैरामीटर मानों पर ToString () को कोई महंगी कॉल नहीं है जब तक सिस्टम की पुष्टि नहीं हो जाती है संदेश वास्तव में लॉग किया जाएगा।
  • Trace.CorrelationManager आपको एक ही लॉजिकल ऑपरेशन के बारे में लॉग विवरणों को सहसंबंधित करने की अनुमति देता है (नीचे देखें)।
  • VisualBasic.Logging.FileLogTraceListener फ़ाइलों को लॉग करने और फ़ाइल रोटेशन का समर्थन करने के लिए लिखने के लिए अच्छा है। हालांकि विजुअलबेसिक नेमस्पेस में, इसे डीएलएल सहित बस सी # (या अन्य भाषा) प्रोजेक्ट में आसानी से उपयोग किया जा सकता है।
  • EventLogTraceListener का उपयोग करते समय यदि आप एकाधिक तर्कों के साथ TraceEvent को कॉल करते हैं और खाली या शून्य प्रारूप स्ट्रिंग के साथ कॉल करते हैं, तो तर्क सीधे इवेंटलॉग.राइटएन्ट्री () पर पास किए जाते हैं यदि आप स्थानीय संदेश संसाधनों का उपयोग कर रहे हैं।
  • सेवा ट्रेस व्यूअर टूल (डब्ल्यूसीएफ से) गतिविधि सहसंबंधित लॉग फ़ाइलों के आलेख देखने के लिए उपयोगी है (भले ही आप डब्ल्यूसीएफ का उपयोग नहीं कर रहे हों)। यह वास्तव में जटिल मुद्दों को डीबग करने में मदद कर सकता है जहां एकाधिक धागे / सक्रियण शामिल हैं।
  • सभी श्रोताओं को साफ़ करके ओवरहेड से बचें (या डिफ़ॉल्ट को हटाएं); अन्यथा डिफॉल्ट ट्रेस सिस्टम में सबकुछ पास कर देगा (और उन सभी ToString () ओवरहेड को ले जाएगा)।

जिन क्षेत्रों में आप विस्तार करना चाहते हैं (यदि आवश्यक हो):

  • डेटाबेस ट्रेस श्रोता
  • रंगीन कंसोल ट्रेस श्रोता
  • एमएसएमक्यू / ईमेल / डब्ल्यूएमआई ट्रेस श्रोताओं (यदि आवश्यक हो)
  • गतिशील कॉन्फ़िगरेशन परिवर्तनों के लिए Trace.Refresh को कॉल करने के लिए FileSystemWatcher को कार्यान्वित करें

अन्य सिफारिशें:

संरचित इवेंट आईडी का उपयोग करें, और एक संदर्भ सूची रखें (उदाहरण के लिए उन्हें एक enum में दस्तावेज़)।

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

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

उदाहरण के लिए पहला अंक सामान्य वर्ग का विवरण दे सकता है: 1xxx का उपयोग 'स्टार्ट' ऑपरेशंस के लिए किया जा सकता है, सामान्य व्यवहार के लिए 2xxx, गतिविधि ट्रेसिंग के लिए 3xxx, चेतावनियों के लिए 4xxx, त्रुटियों के लिए 5xxx, 'स्टॉप' ऑपरेशंस के लिए 8xxx, घातक त्रुटियों के लिए 9xxx, आदि।

दूसरा अंक क्षेत्र की जानकारी दे सकता है, उदाहरण के लिए डेटाबेस जानकारी के लिए 21xx (डेटाबेस चेतावनियों के लिए 41xx, डेटाबेस त्रुटियों के लिए 51xx), गणना मोड के लिए 22xx (गणना चेतावनियों के लिए 42xx, आदि), अन्य मॉड्यूल के लिए 23xx इत्यादि।

असाइन किया गया, संरचित इवेंट आईडी भी आपको फ़िल्टर में उपयोग करने की अनुमति देता है।

प्रश्न: यदि आप ट्रेसिंग का उपयोग करते हैं, तो क्या आप Trace.Correlation.StartLogicalOperation का उपयोग करते हैं?

ए: Trace.CorrelationManager किसी भी प्रकार के बहु-थ्रेडेड वातावरण में लॉग स्टेटमेंट से संबंधित होने के लिए बहुत उपयोगी है (जो इन दिनों काफी कुछ है)।

सहसंबंध करने के लिए आपको प्रत्येक लॉजिकल ऑपरेशन के लिए एक बार गतिविधि आईडी को सेट करने की आवश्यकता है।

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

सर्विस ट्रेस व्यूअर टूल गतिविधि ग्राफ देखने के लिए उपयोगी हो सकता है (भले ही आप डब्ल्यूसीएफ का उपयोग नहीं कर रहे हों)।

प्रश्न: क्या आप इस कोड को मैन्युअल रूप से लिखते हैं, या आप इसे करने के लिए पहलू उन्मुख प्रोग्रामिंग के कुछ रूपों का उपयोग करते हैं? एक कोड स्निपेट साझा करने के लिए देखभाल?

ए: आप एक स्कोप क्लास बनाना चाहते हैं, उदाहरण के लिए लॉजिकलऑपरेशनस्कोप, कि (ए) बनाए गए संदर्भ को सेट करता है और (बी) निपटारे जाने पर संदर्भ को रीसेट करता है।

यह स्वचालित रूप से संचालन को स्वचालित रूप से लपेटने के लिए निम्न जैसे कोड लिखने की अनुमति देता है:

  using( LogicalOperationScope operation = new LogicalOperationScope("Operation") )
  {
    // .. do work here
  }

सृजन पर स्कोप पहले यदि आवश्यक हो तो ActivityId सेट कर सकता है, StartLogicalOperation को कॉल करें और फिर TraceEventType.Start संदेश लॉग करें। निपटान पर यह एक स्टॉप संदेश लॉग कर सकता है, और फिर StopLogicalOperation को कॉल करें।

प्रश्न: क्या आप ट्रेस स्रोतों पर ग्रैन्युलरिटी का कोई भी रूप प्रदान करते हैं? उदाहरण के लिए, डब्ल्यूपीएफ ट्रेस स्रोत आपको विभिन्न स्तरों पर कॉन्फ़िगर करने की अनुमति देते हैं।

ए: हां, सिस्टम के बड़े होने के कारण, एकाधिक ट्रेस स्रोत उपयोगी / महत्वपूर्ण होते हैं।

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

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

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

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

यदि आपको और भी बढ़िया ट्यून किए गए नियंत्रण की आवश्यकता है, तो विशिष्ट उच्च मात्रा ट्रेसिंग चालू / बंद करने के लिए व्यक्तिगत बूलियन स्विच जोड़ें, उदाहरण के लिए कच्चे संदेश डंप। (या डब्ल्यूसीएफ / डब्ल्यूपीएफ के समान, एक अलग ट्रेस स्रोत का उपयोग किया जा सकता है)।

आप गतिविधि ट्रेसिंग बनाम सामान्य (अन्य) लॉगिंग के लिए अलग-अलग ट्रेस स्रोतों पर भी विचार करना चाहेंगे, क्योंकि यह फ़िल्टर को कॉन्फ़िगर करने के लिए थोड़ा आसान बना सकता है कि आप उन्हें कैसे चाहते हैं।

ध्यान दें कि विभिन्न स्रोतों का उपयोग होने पर भी संदेशों को गतिविधि आईडी के माध्यम से सहसंबंधित किया जा सकता है, इसलिए जितनी आवश्यकता हो उतनी उपयोग करें।

श्रोताओं

प्रश्न: आप किस लॉग आउटपुट का उपयोग करते हैं?

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

मैं आमतौर पर आउटपुट को तीन समूहों में वर्गीकृत करता हूं:

(1) घटनाक्रम - विंडोज इवेंट लॉग (और ट्रेस फाइलें)

उदाहरण के लिए यदि कोई सर्वर / सेवा लिखना है, तो विंडोज़ इवेंट लॉग का उपयोग करना विंडोज़ पर सबसे अच्छा अभ्यास है (आपके पास रिपोर्ट करने के लिए यूआई नहीं है)।

इस मामले में सभी घातक, त्रुटि, चेतावनी और (सेवा-स्तर) सूचना ईवेंट विंडोज इवेंट लॉग पर जाना चाहिए। इन स्तरों के उच्च स्तर की घटनाओं के लिए सूचना स्तर आरक्षित होना चाहिए, जिन्हें आप ईवेंट लॉग में जाना चाहते हैं, जैसे "सेवा प्रारंभ", "सेवा रोक दी गई", "Xyz से कनेक्ट", और यहां तक ​​कि "अनुसूची आरंभ" , "उपयोगकर्ता लॉग ऑन ऑन", आदि

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

इसके विपरीत, एक विंडोज जीयूआई एप्लिकेशन आमतौर पर उपयोगकर्ता को रिपोर्ट करेगा (हालांकि वे विंडोज इवेंट लॉग पर भी लॉग इन कर सकते हैं)।

घटनाओं में संबंधित प्रदर्शन काउंटर भी हो सकते हैं (उदाहरण के लिए त्रुटियों / सेकंड की संख्या), और इवेंट लॉग, प्रदर्शन काउंटर, ट्रेस सिस्टम पर लिखने और उपयोगकर्ता को रिपोर्ट करने के लिए किसी भी प्रत्यक्ष लेखन को समन्वयित करना महत्वपूर्ण हो सकता है ताकि वे उसी समय।

यानी यदि कोई उपयोगकर्ता किसी विशेष समय पर एक त्रुटि संदेश देखता है, तो आपको Windows इवेंट लॉग में एक ही त्रुटि संदेश, और फिर उसी ईवेंट को ट्रेस लॉग (अन्य ट्रेस विवरण के साथ) में एक ही टाइमस्टैम्प के साथ मिलना चाहिए।

(2) गतिविधियां - एप्लिकेशन लॉग फाइल या डेटाबेस तालिका (और ट्रेस फाइलें)

यह एक नियमित गतिविधि है जो एक प्रणाली करता है, उदाहरण के लिए वेब पेज परोसा जाता है, शेयर बाजार व्यापार दर्ज किया जाता है, आदेश लिया जाता है, गणना की जाती है आदि।

गतिविधि ट्रेसिंग (स्टार्ट, स्टॉप, इत्यादि) यहां उपयोगी है (दाएं ग्रेनेलिटी पर)।

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

आपके आवेदन के आधार पर चीजें थोड़ा धुंधला हो सकती हैं। एक अच्छा उदाहरण एक वेब सर्वर हो सकता है जो प्रत्येक अनुरोध को वेब लॉग में लिखता है; इसी तरह के उदाहरण एक मैसेजिंग सिस्टम या गणना प्रणाली हो सकती हैं जहां प्रत्येक ऑपरेशन एप्लिकेशन-विशिष्ट विवरण के साथ लॉग होता है।

स्टॉक मार्केट ट्रेड या बिक्री ऑर्डरिंग सिस्टम इतना अच्छा उदाहरण नहीं है। इन प्रणालियों में आप संभवतः गतिविधि को लॉग इन कर रहे हैं क्योंकि उनके पास महत्वपूर्ण व्यावसायिक मूल्य है, हालांकि अन्य कार्यों के साथ उन्हें सहसंबंधित करने का प्रिंसिपल अभी भी महत्वपूर्ण है।

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

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

(3) डीबग ट्रेस - टेक्स्ट फ़ाइल, या शायद एक्सएमएल या डेटाबेस।

यह वर्बोज़ स्तर और निम्न (जैसे कस्टम बूलियन स्विच कच्चे डेटा डंप चालू / बंद करने के लिए) पर जानकारी है। यह एक उप-गतिविधि स्तर पर एक सिस्टम क्या कर रहा है के बारे में जानकारी या विवरण प्रदान करता है।

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

इस जानकारी और एप्लिकेशन लॉग फ़ाइल के बीच एक बड़ा अंतर यह है कि यह असंरचित है। जबकि किसी एप्लिकेशन लॉग में, से, राशि, इत्यादि के लिए फ़ील्ड हो सकते हैं, वर्बोज़ डीबग निशान जो भी प्रोग्रामर डालता है, हो सकता है, उदाहरण के लिए "मान X = {value}, वाई = झूठी", या यादृच्छिक टिप्पणियां / मार्कर जैसे " इसे फिर से कोशिश कर रहा है "।

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

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

प्रश्न: यदि फाइलों का उपयोग करते हैं, तो क्या आप रोलिंग लॉग या सिर्फ एक फ़ाइल का उपयोग करते हैं? लोगों के उपभोग के लिए आप लॉग कैसे उपलब्ध कराते हैं?

ए: फ़ाइलों के लिए, आम तौर पर आप एक प्रबंधन क्षमता बिंदु से रोलिंग लॉग फ़ाइलों को चाहते हैं (System.Diagnostics के साथ बस VisualBasic.Logging.FileLogTraceListener का उपयोग करें)।

उपलब्धता फिर से सिस्टम पर निर्भर करती है। यदि आप केवल फाइलों के बारे में बात कर रहे हैं तो सर्वर / सेवा के लिए, रोलिंग फाइलों को केवल तब तक एक्सेस किया जा सकता है जब आवश्यक हो। (विंडोज इवेंट लॉग या डाटाबेस एप्लीकेशन लॉग का अपना एक्सेस मैकेनिज्म होगा)।

यदि आपके पास फ़ाइल सिस्टम तक आसान पहुंच नहीं है, तो डेटाबेस में ट्रेसिंग डीबग करना आसान हो सकता है। [यानी एक डेटाबेस TraceListener लागू करें]।

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

यदि, हालांकि यह किसी समस्या को दुर्घटनाग्रस्त या सामना करना पड़ा तो फ़ाइल हटाई नहीं गई थी। या तो अगर यह त्रुटि को पकड़ता है, या अगली बार जब यह चलता है तो यह फ़ाइल को नोटिस करेगा, और फिर यह कार्रवाई कर सकता है, उदाहरण के लिए इसे संकुचित करें (उदाहरण के लिए 7zip) और इसे ईमेल करें या अन्यथा उपलब्ध कराएं।

इन दिनों कई प्रणालियों में केंद्रीय सर्वर में असफलताओं की स्वचालित रिपोर्टिंग शामिल होती है (उपयोगकर्ताओं के साथ जांच करने के बाद, उदाहरण के लिए गोपनीयता कारणों से)।

देखना

प्रश्न: लॉग देखने के लिए आप किस टूल्स का उपयोग करते हैं?

ए: यदि आपके पास अलग-अलग कारणों से एकाधिक लॉग हैं तो आप एकाधिक दर्शक का उपयोग करेंगे।

नोटपैड / वीआई / नोटपैड ++ या कोई अन्य टेक्स्ट एडिटर सादा पाठ लॉग के लिए मूलभूत है।

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

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

आम तौर पर विंडोज इवेंट लॉग इन महत्वपूर्ण घटनाओं को एमओएम या ओपन व्यू जैसे उपकरणों की निगरानी के लिए भी उपलब्ध कराता है।

अन्य -

यदि आप किसी डेटाबेस में लॉग ऑन करते हैं तो फ़िल्टर करना और सॉर्ट करना सॉर्ट करना आसान हो सकता है (उदाहरण के लिए किसी विशेष गतिविधि आईडी पर ज़ूम इन करें। (टेक्स्ट फ़ाइलों के साथ आप Grep / PowerShell का उपयोग कर सकते हैं या आप जिस पार्टिवियर GUID पर फ़िल्टर के समान हैं)

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

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

ध्यान दें कि ढांचे में रंगीन कंसोल लॉगर या डेटाबेस लॉगर शामिल नहीं है, इसलिए, आपको इन्हें लिखने की आवश्यकता होगी यदि आपको उनकी आवश्यकता है (यह बहुत कठिन नहीं है)।

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

प्रश्न: यदि आप एएसपी.नेट समाधान बना रहे हैं, तो क्या आप एएसपी.नेट स्वास्थ्य निगरानी का भी उपयोग करते हैं? क्या आप स्वास्थ्य मॉनीटर घटनाओं में ट्रेस आउटपुट शामिल करते हैं? Trace.axd के बारे में क्या?

जरूरत के अनुसार इन चीजों को चालू / बंद किया जा सकता है। मुझे Trace.axd डिबगिंग के लिए काफी उपयोगी लगता है कि सर्वर कुछ चीजों का जवाब कैसे देता है, लेकिन यह आम तौर पर भारी उपयोग किए जाने वाले वातावरण में या दीर्घकालिक ट्रेसिंग के लिए उपयोगी नहीं होता है।

प्रश्न: कस्टम प्रदर्शन काउंटर के बारे में क्या?

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

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

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


मुझे प्लेटफॉर्म लचीलापन (डेस्कटॉप .Net / कॉम्पैक्ट फ्रेमवर्क, 32/64-बिट) दृष्टिकोण से आने वाले मामले में लॉग 4नेट की सिफारिश करने वाले कोरस में शामिल होना है।

हालांकि, इसे एक निजी लेबल एपीआई में लपेटना एक प्रमुख विरोधी पैटर्न हैlog4net.ILogger पहले से ही कॉमन्स लॉगिंग रैपर API का नेट समकक्ष है, इसलिए युग्मन आपके लिए पहले ही कम हो चुका है, और चूंकि यह अपाचे लाइब्रेरी भी है, यह आम तौर पर चिंता का विषय नहीं है क्योंकि आप कोई नियंत्रण नहीं छोड़ रहे हैं: कांटा अगर आपको चाहिए तो।

मैंने देखा है कि ज्यादातर घर रैपर पुस्तकालय भी दोषों की एक या अधिक लीटनी प्रतिबद्ध करते हैं:

  1. एक वैश्विक सिंगलटन लॉगर (या समकक्ष रूप से एक स्थिर प्रविष्टि बिंदु) का उपयोग करना जो किसी भी अन्य चयन लाभ के लिए अनुशंसित लॉगर-प्रति-वर्ग पैटर्न का अच्छा समाधान खो देता है।
  2. वैकल्पिक Exception तर्क का पर्दाफाश करने में विफल , कई समस्याओं का कारण बनता है:
    • यह एक अपवाद लॉगिंग नीति को बनाए रखने के लिए और भी मुश्किल बनाता है, इसलिए अपवादों के साथ लगातार कुछ भी नहीं किया जाता है।
    • एक सतत नीति के साथ भी, एक स्ट्रिंग में अपवाद को स्वरूपित करना समय से पहले डेटा खो देता है। मैंने एक कस्टम ILayout सजावट लिखा है जो घटनाओं की श्रृंखला निर्धारित करने के लिए अपवाद पर विस्तृत ड्रिल-डाउन करता है।
  3. Is Level Enabled गुणों का पर्दाफाश करने में विफलता , जो क्षेत्र या लॉगिंग के स्तर बंद होने पर स्वरूपण कोड छोड़ने की क्षमता को छोड़ देता है।

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

वहां वास्तव में .NET के लिए कुछ लॉगिंग फ्रेमवर्क और टूल हैं। DotNetLogging.com पर विभिन्न टूल की एक सिंहावलोकन और तुलना है।


जहां तक ​​पहलू उन्मुख लॉगिंग का सवाल है, मुझे एक अन्य एसओ प्रश्न पर पोस्टशर्प की सिफारिश की गई थी -

एकता के साथ ओरिएंटेड लॉगिंग पहलू \ T4 \ कुछ और

अगर आप लॉगिंग फ्रेमवर्क का मूल्यांकन कर रहे हैं तो उत्तर में प्रदान किया गया लिंक देखने लायक है।


var list = (from u in db.Users join c in db.Customers on u.CustomerId equals c.CustomerId where u.Username == username
   select new {u.UserId, u.CustomerId, u.ClientId, u.RoleId, u.Username, u.Email, u.Password, u.Salt, u.Hint1, u.Hint2, u.Hint3, u.Locked, u.Active,c.ProfilePic}).First();

अपने इच्छित टेबल नाम लिखें, और फ़ील्ड के परिणाम प्राप्त करने के लिए चयन शुरू करें।





.net asp.net logging tracing