सर्वश्रेष्ठ प्रथाओं में प्रवेश करना [बंद]


323

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

फ़्रेमवर्क

आप किन रूपरेखाओं का उपयोग करते हैं?

  • log4net
  • System.Diagnostics.Trace
  • System.Diagnostics.TraceSource
  • लॉगिंग एप्लिकेशन ब्लॉक
  • अन्य?

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

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

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

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

श्रोताओं

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

  • पाठ फ़ाइलें
  • XML फ़ाइलें
  • इवेंट लोग
  • अन्य?

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

देखना

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

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

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

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


3
यह उपयोगी होगा यदि 300 अपवोट्स के साथ इस तरह के सवालों को बंद करने वाले लोग या तो विकी प्रारूप या प्रोग्रामर.स्टैकएक्सचेंज पर पोस्ट करने का सुझाव दे सकते हैं, या यदि इस प्रकार का प्रश्न स्वागत योग्य नहीं है तो Quora। जाहिर है कि सवाल वास्तव में बहुत रचनात्मक है, यह सिर्फ मापदंड नहीं है जो स्टैकऑवरफ्लो चाहता है। programmers.stackexchange.com/questions/57064/… में 24 अपवोट हैं। शायद StackOverflow कुछ याद आ रही है?
Niall Connaughton

यदि यह प्रश्न प्रश्नोत्तर प्रारूप का उल्लंघन करता है तो प्रश्नोत्तर प्रारूप के साथ प्रश्नपत्र गलत है और इस प्रश्न के साथ नहीं। कभी-कभी यह निर्णय कि क्या किसी प्रश्न को बंद किया जाना चाहिए, प्रदान किए गए उत्तरों का एक फ़ंक्शन होना चाहिए, कुछ खुले-समाप्त प्रश्न बहस को आमंत्रित करते हैं, लेकिन अन्य उपयोगकर्ताओं को मूल्यवान सामग्री प्रदान करने के लिए आमंत्रित करते हैं, जैसे कि यह एक!
मथायस वुल्फ

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

जवाबों:


232

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


फ़्रेमवर्क

प्रश्न: आप किन रूपरेखाओं का उपयोग करते हैं?

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

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

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

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

यह मुझे लगता है कि अन्य फ्रेमवर्क, यहां तक ​​कि एंटलीब, सिर्फ़ Not Invented Here Syndrome से पीड़ित हैं, और मुझे लगता है कि उन्होंने समय बर्बाद कर दिया है ताकि पहले से ही पूरी तरह से अच्छी तरह से काम करने वाले बेसिक्स का पुनः आविष्कार कर सकें। कुछ अंतरालों को भरने के बजाय जो मौजूद हैं। संक्षेप में, उनका उपयोग न करें - उनकी आवश्यकता नहीं है।

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

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

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

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

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

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

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

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

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

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

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

प्रश्न: यदि आप ट्रेसिंग का उपयोग करते हैं, तो क्या आप ट्रेस का उपयोग करते हैं। सहसंबंध।

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

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

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

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

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

A: आप एक स्कोप क्लास बनाना चाह सकते हैं, जैसे LogicalOperationScope, कि (a) जब सेट होता है तो संदर्भ सेट करता है और (b) डिस्पोज़ होने पर संदर्भ को रीसेट करता है।

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

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

यदि आवश्यक हो तो स्कोप बनाने के लिए स्कोप पहले एक्टिविटी सेट कर सकता है, StartLogicalOperation पर कॉल करें और फिर TraceEventType.Start मैसेज लॉग करें। डिस्पोज़ करने पर यह एक स्टॉप मैसेज को लॉग कर सकता है, और फिर स्टॉपलोजिकलऑपरेशन को कॉल कर सकता है।

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

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

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

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

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

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

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

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

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


श्रोताओं

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

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

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

(1) ईवेंट - विंडोज ईवेंट लॉग (और ट्रेस फ़ाइलें)

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

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

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

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

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

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

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

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

गतिविधि अनुरेखण (प्रारंभ, रोक, आदि) यहां (सही दाने पर) उपयोगी है।

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

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

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

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

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

(३) डिबग ट्रेस - टेक्स्ट फ़ाइल, या शायद XML या डेटाबेस।

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

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

इस जानकारी और एक अनुप्रयोग लॉग फ़ाइल के बीच एक बड़ा अंतर यह है कि यह असंरचित है। जब भी एक एप्लिकेशन लॉग में To, From, Amount आदि के लिए फ़ील्ड्स हो सकते हैं, Verbose डिबग ट्रैस वह हो सकता है जो कोई प्रोग्रामर डालता है, उदाहरण के लिए "मानों की जाँच X = {मान}, Y = गलत", या यादृच्छिक टिप्पणी / मार्कर जैसे " हो गया, फिर से कोशिश करना ”।

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

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

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

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

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

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

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

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

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


देखना

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

A: यदि आपके पास विभिन्न कारणों से कई लॉग हैं तो आप कई दर्शकों का उपयोग करेंगे।

नोटपैड / vi / नोटपैड ++ या किसी अन्य पाठ संपादक सादे पाठ लॉग के लिए बुनियादी है।

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

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

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

अन्य --

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

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

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

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

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

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

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

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

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

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

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


FYI करें: मुझे एक समस्या का सामना करना पड़ा जहाँ microsoft एक फ़ाइल के क्रैश होने का पता लगाता है। यदि आपके पास एक ही फ़ाइल में कई प्रक्रियाएँ (या थ्रेड्स) हैं और वे टकराते हैं तो आपको लॉग फ़ाइल पर फ़ाइल सिस्टम एक्सक्लूसिव एक्सेस लॉकिंग एरर मिलती है।
जय

1
System.Diagnostics बुनियादी ढाँचा सुरक्षित है; डिफ़ॉल्ट व्यवहार लॉक करने की रूपरेखा के लिए है, हालांकि यदि आप अपना लॉकिंग प्रदान करते हैं तो आप TraceListener.IsThreadSafe को ओवरराइड कर सकते हैं। Msdn.microsoft.com/en-us/library/… देखें । कई प्रक्रियाओं के लिए आप आमतौर पर अलग-अलग फ़ाइलों को लिखते हैं, लेकिन ध्यान दें कि सर्विस ट्रेस व्यूअर कई ट्रेस फ़ाइलों (जैसे कई मशीनों से) को लोड कर सकता है और उन्हें ActivId के माध्यम से सहसंबंधित कर सकता है।
स्ली ग्रिफन

1
आप अपवादों को लॉग करने के लिए ट्रेसवेंट () का उपयोग करने का सुझाव दे सकते हैं?
दिमित्री सोसुनोव

1
क्या इसका एक प्रमुख कारण यह नहीं है System.Diagnostics.Traceकि इसे सजाया गया है, [Conditional("TRACE")]जो इसे उत्पादन के माहौल में अनुपयोगी बनाता है, जहाँ आपको शायद ही कभी TRACEध्वज के साथ संकलित किया गया हो ?
असबजर्न उल्सबर्ग

2
@asbjornu Visual Studio में डिफ़ॉल्ट रिलीज़ बिल्ड कॉन्फ़िगरेशन ने TRACE को परिभाषित किया है (यह DEBUG है जो रिलीज़ बिल्ड के लिए बंद है); यदि आप कमांड लाइन से निर्माण करते हैं, तो आपको इसे चालू करने की आवश्यकता है।
स्ली ग्रीफॉन

40

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

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

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

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

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

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

1
किसी चीज को एंटी-पैटर्न कहने का मतलब यह नहीं है कि यह हमेशा 100% एक बुरा विचार है - बस यह कि अगर आप सावधान नहीं हैं तो अपने आप को एक कोने में पेंट करने की प्रवृत्ति पैदा करता है। इसके अलावा, ILog / LogManager खुद कॉमन्स-लॉगिंग की छवि में एक अच्छी तरह से लिखित आवरण मिनी-लाइब्रेरी है जो log4net असेंबली में बंडल है, लेकिन कोई कारण नहीं है कि इसे निकाला नहीं जा सकता और CLR के लिए एक उचित कॉमन्स-लॉगिंग में बदल गया।
जेफरी हंटिन

18

मैं अक्सर asp.net में विकसित नहीं होता, हालांकि जब यह लकड़हारे की बात आती है तो मुझे लगता है कि बहुत सारे सर्वोत्तम अभ्यास सार्वभौमिक हैं। यहाँ मेरे कुछ यादृच्छिक विचार हैं जो मैंने वर्षों से सीखा है:

फ़्रेमवर्क

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

लकड़हारा आउटपुट

  • लॉगिंग के लिए XML / RSS शैली लॉग से बचने की कोशिश करें जो भयावह विफलताओं का सामना कर सके। यह महत्वपूर्ण है क्योंकि यदि आपके लकड़हारे को बंद </xxx>टैग लिखने के बिना पावर स्विच बंद हो जाता है , तो आपका लॉग टूट गया है।
  • लॉग लॉग करें। अन्यथा, आपके कार्यक्रम के प्रवाह को ट्रैक करना बहुत मुश्किल हो सकता है।
  • यदि आपको अपने लॉग का अंतर्राष्ट्रीयकरण करना है, तो आप चाहते हैं कि केवल डेवलपर ही अंग्रेज़ी में लॉग इन करे (या आपकी पसंद की भाषा)।
  • कभी-कभी SQL प्रश्नों में लॉगिंग स्टेटमेंट डालने का विकल्प होने से डिबगिंग स्थितियों में एक जीवनरक्षक हो सकता है। जैसे कि:
    - इनवॉचिंग क्लास: com.foocorp.foopackage.FooClass: 9021
    चयन करें * फू से;
  • आप वर्ग-स्तरीय लॉगिंग चाहते हैं। आप सामान्य रूप से लकड़हारा के स्थिर उदाहरण भी नहीं चाहते हैं - यह सूक्ष्म अनुकूलन के लायक नहीं है।
  • लॉग किए गए अपवादों को चिह्नित करना और वर्गीकृत करना कभी-कभी उपयोगी होता है क्योंकि सभी अपवाद समान नहीं बनाए जाते हैं। इसलिए महत्वपूर्ण अपवादों का एक सबसेट जानना समय का प्रमुख है, यदि आपके पास एक लॉग मॉनीटर है जो महत्वपूर्ण राज्यों पर सूचनाएं भेजने की आवश्यकता है।
  • डुप्लीकेशन फिल्टर आपकी दृष्टि और हार्ड डिस्क को बचाएगा। क्या आप वास्तव में एक ही लॉगिंग स्टेटमेंट को 10 ^ 10000000 बार दोहराया जाना चाहते हैं? क्या केवल एक संदेश प्राप्त करना बेहतर नहीं होगा: This is my logging statement - Repeated 100 times

मेरा यह प्रश्न भी देखिए ।


5
डुप्लिकेट फ़िल्टर एक महान विचार हैं
पॉल स्टोवेल

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

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

मैं आरएसएस पर सहमत हूं। मैं विज़ुअलाइज़ेशन टूल के बारे में अधिक सोच रहा हूं जो आपको प्रविष्टि को बेहतर ढंग से समझने की अनुमति देता है। पाठ फ़ाइलों के साथ आप आम तौर पर एक पंक्ति में प्रवेश रखना चाहते हैं; लेकिन कभी-कभी आप स्टैक के निशान या क्रमबद्ध वस्तुओं को शामिल करना चाहते हैं। यही वह जगह है जहाँ एक XML लॉग (WCF द्वारा उपयोग किया जाता है) काम आता है
पॉल स्टोवेल

एसक्यूएल प्रश्नों के उल्लेख के लिए +1। यह वास्तव में डेटाबेस निशान और अनुप्रयोग निशान के सहसंबंध के लिए बहुत उपयोगी है। मैं इसे अपने डीएएल में मैन्युअल रूप से कर रहा हूं, लेकिन मुझे आश्चर्य है कि इस तकनीक के लिए किस तरह का उपकरण समर्थन है?
कांस्टेंटिन

17

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

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

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

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

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

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

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


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

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

9

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

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

  • विभिन्न वातावरणों पर सरल विन्यास / पुन: संयोजन
  • पूर्व-निर्मित अपेंडरों की अच्छी संख्या
  • CMS का हम पहले से ही उपयोग कर चुके हैं
  • लॉग स्तर और उनके आसपास विन्यास की अच्छी संख्या

मुझे उल्लेख करना चाहिए, यह ASP.NET विकास के दृष्टिकोण से बोल रहा है

मैं ट्रेस का उपयोग करने में कुछ खूबियों को देख सकता हूं जो कि .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);
}

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

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. त्रुटि और घातक के लिए ईमेल भेजना

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

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


लॉगिंग फ्रेमवर्क कुछ उदाहरणों में से एक है जहां सिंगलटन का दुरुपयोग नहीं है।
mmcdole

यदि आप अपने लकड़हारे के आसपास एक संदर्भ प्रदान करना चाहते हैं तो यह हो सकता है। लेकिन यह समसामयिकता से निपटने में मदद करता है
हारून पॉवेल

7
मैं निश्चित रूप से सिंगलटन को चीर दूंगा। आपके पास निश्चित रूप से एक एकल उदाहरण हो सकता है जो चारों ओर से गुजरता है (अधिमानतः IOC / DI कंटेनर में)। मैं एक इंटरसेप्टर में लॉगिंग को स्थानांतरित करने का भी प्रयास
करूंगा

2
एकल उदाहरण के प्रशंसक भी नहीं। मैं प्रत्येक वर्ग को एक विशिष्ट नामित लकड़हारा देना पसंद करता हूं, इसलिए प्रति मॉड्यूल आधार पर लॉगिंग को ऊपर या नीचे करना आसान है।
जेफरी हेंटिन

8

आप किन रूपरेखाओं का उपयोग करते हैं?

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

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

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

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

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

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

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

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


6

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

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


5

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

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


1

हम अपने वेब एप्लिकेशन पर log4net का उपयोग करते हैं।

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

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

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

हम एक डेटाबेस और ट्रेस सिस्टम की सभी घटनाओं को लिखते हैं। ईवेंट लॉग हम त्रुटियों या अपवादों के लिए उपयोग करते हैं। हम एक डेटाबेस में अधिकांश घटनाओं को लॉग करते हैं ताकि हम कस्टम रिपोर्ट बना सकें और उपयोगकर्ताओं को लॉग को देखने दे सकें यदि वे एप्लिकेशन से सही करना चाहते हैं।


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

1

जहां तक ​​पहलू उन्मुख लॉगिंग का संबंध है, तो मुझे एक और SO प्रश्न पर PostSharp की सिफारिश की गई थी -

ऐस्पेक्ट ओरिएंटेड लॉगिंग विद यूनिटी \ T4 \ और कुछ भी

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

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