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




शिक्षार्थी केंद्रित शिक्षण (7)

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

फ़्रेमवर्क

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

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

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

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

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

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

श्रोताओं

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

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

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

देखना

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

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

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

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

https://code.i-harness.com


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

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


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

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

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


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

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

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

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

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

फ़्रेमवर्क

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

लॉगर आउटपुट

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

मेरा यह सवाल भी देखें।


लॉग लॉग उदाहरण के लिए एक सिंगलटन रैपर के साथ लॉगिंग प्रदाता के रूप में हम लॉग 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 का उपयोग नहीं करते हैं क्योंकि हम अक्सर एक साइट देना चाहते हैं की तुलना में उच्च सुरक्षा की आवश्यकता हो सकती है।

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


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

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

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

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

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


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

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

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

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

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

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

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

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

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





tracing