मैं @Alex हम्फ्रे की सिफारिश से सहमत TraceSources उपयोग करने का प्रयास करने के लिए। TraceSources के साथ आप अपने लॉगिंग/ट्रेसिंग कथन कैसे निष्पादित करते हैं, इस पर अधिक नियंत्रण प्राप्त करते हैं। उदाहरण के लिए, अगर आप इस तरह कोड हो सकता है:
public class MyClass1
{
private static readonly TraceSource ts = new TraceSource("MyClass1");
public DoSomething(int x)
{
ts.TraceEvent(TraceEventType.Information, "In DoSomething. x = {0}", x);
}
}
public class MyClass2
{
private static readonly TraceSource ts = new TraceSource("MyClass2");
public DoSomething(int x)
{
ts.TraceEvent(TraceEventType.Information, "In DoSomething. x = {0}", x);
}
}
TraceSource.TraceEvent कॉल स्वचालित रूप से जुड़े स्विच के लिए कॉन्फ़िगर किया गया स्तर के खिलाफ संदेश (TraceEventType.Information) के स्तर की जाँच करेगा और चाहे या नहीं का निर्धारण करेगा संदेश वास्तव में लिखा जाना चाहिए।
प्रत्येक प्रकार के लिए एक अलग नाम TraceSource का उपयोग करके आप उन वर्गों को व्यक्तिगत रूप से प्रवेश नियंत्रित कर सकते हैं। आप MyClass1 लॉगिंग को सक्षम कर सकते हैं या आप इसे अक्षम कर सकते हैं या आप इसे सक्षम कर सकते हैं, लेकिन अगर यह संदेश का स्तर (TraceEventType) एक निश्चित मान से अधिक है (शायद केवल "चेतावनी" और उच्चतर लॉग हो) तो यह लॉग हो सकता है। साथ ही, आप MyClass2 में लॉग ऑन करना बंद कर सकते हैं या MyClass1 के पूरी तरह से स्वतंत्र रूप से स्तर पर सेट कर सकते हैं। यह सभी सक्षम/अक्षम/स्तर की सामग्री app.config फ़ाइल में होती है।
app.config फ़ाइल का प्रयोग करके आप एक ही तरह से सभी TraceSources (या TraceSources के समूह) को नियंत्रित कर सकता है। तो, आप कॉन्फ़िगर कर सकते हैं ताकि MyClass1 और MyClass2 दोनों एक ही स्विच द्वारा नियंत्रित हो।
आप प्रत्येक प्रकार के लिए एक अलग नाम TraceSource है नहीं करना चाहते हैं, तो आप सिर्फ एक ही TraceSource हर कक्षा में बना सकते हैं:
public class MyClass1
{
private static readonly TraceSource ts = new TraceSource("MyApplication");
public DoSomething(int x)
{
ts.TraceEvent(TraceEventType.Information, "In DoSomething. x = {0}", x);
}
}
public class MyClass2
{
private static readonly TraceSource ts = new TraceSource("MyApplication");
public DoSomething(int x)
{
ts.TraceEvent(TraceEventType.Information, "In DoSomething. x = {0}", x);
}
}
इस तरह, आप सब अपने आवेदन के भीतर प्रवेश करने से हो कर सकता है एक ही स्तर पर (या बंद हो या एक ही TraceListener, या जो भी हो)।
तुम भी स्वतंत्र रूप से विन्यास होने के लिए अपने आवेदन के विभिन्न भागों को कॉन्फ़िगर कर सकता है प्रत्येक प्रकार में एक अद्वितीय TraceSource को परिभाषित करने की "मुसीबत" पर जाए बिना:
public class Analysis1
{
private static readonly TraceSource ts = new TraceSource("MyApplication.Analysis");
public DoSomething(int x)
{
ts.TraceEvent(TraceEventType.Information, "In DoSomething. x = {0}", x);
}
}
public class Analysis2
{
private static readonly TraceSource ts = new TraceSource("MyApplication.Analysis");
public DoSomething(int x)
{
ts.TraceEvent(TraceEventType.Information, "In DoSomething. x = {0}", x);
}
}
public class DataAccess1
{
private static readonly TraceSource ts = new TraceSource("MyApplication.DataAccess");
public DoSomething(int x)
{
ts.TraceEvent(TraceEventType.Information, "In DoSomething. x = {0}", x);
}
}
public class DataAccess2
{
private static readonly TraceSource ts = new TraceSource("MyApplication.DataAccess");
public DoSomething(int x)
{
ts.TraceEvent(TraceEventType.Information, "In DoSomething. x = {0}", x);
}
}
अपने वर्ग इस तरह से instrumented साथ
, आप कर सकते थे एक स्तर पर अपने अनुप्रयोग लॉग का "DataAccess" हिस्सा बनाने, जबकि "विश्लेषण" एक अलग स्तर पर अपने अनुप्रयोग लॉग का हिस्सा (जाहिर है, या तो या आपके एप्लिकेशन के दोनों भागों विन्यस्त किया जा सकता है, ताकि लॉगिंग अक्षम है)।
यहाँ एक app.config फ़ाइल कि TraceSources और TraceSwitches कॉन्फ़िगर करता है का एक हिस्सा है:
<system.diagnostics>
<trace autoflush="true"></trace>
<sources>
<source name="MyClass1" switchName="switch1">
<listeners>
<remove name="Default"></remove>
<add name="console"></add>
</listeners>
</source>
<source name="MyClass2" switchName="switch2">
<listeners>
<remove name="Default"></remove>
<add name="console"></add>
</listeners>
</source>
</sources>
<switches>
<add name="switch1" value="Information"/>
<add name="switch2" value="Warning"/>
</switches>
<sharedListeners>
<add name="console"
type="System.Diagnostics.ConsoleTraceListener">
</add>
<add name="file"
type="System.Diagnostics.TextWriterTraceListener"
initializeData="trace.txt">
</add>
</sharedListeners>
</system.diagnostics>
आप देख सकते हैं, आप एक ही TraceSource और एक भी स्विच कॉन्फ़िगर कर सकता है और सभी प्रवेश के लिए एक एकल के साथ होता है नियंत्रण का स्तर (यानी आप सभी लॉगिंग बंद कर सकते हैं या इसे एक निश्चित स्तर पर लॉग कर सकते हैं)।
वैकल्पिक रूप से, आप एक से अधिक TraceSources निर्धारित कर सकते हैं (और अपने कोड में इसी TraceSources संदर्भ) और कई स्विच करता है। स्विच साझा किए जा सकते हैं (यानी एकाधिक ट्रेसे स्रोत एक ही स्विच का उपयोग कर सकते हैं)।
आखिरकार, ट्रेस स्रोतों का उपयोग करने के लिए थोड़ा और प्रयास करके और अपने कोड में उचित नाम वाले ट्रेस स्रोतों का संदर्भ देने के लिए (यानी ट्रेस स्रोत नामों को तार्किक रूप से परिभाषित करें ताकि आपके ऐप में लॉगिंग पर वांछित डिग्री हो), आप लंबे समय तक महत्वपूर्ण लचीलापन हासिल करेंगे।
यहाँ कुछ लिंक है कि आप System.Diagnostics के साथ मदद कर सकता है के रूप में आप आगे जाने हैं:
.net Diagnostics best practices?
Logging best practices
What's the best approach to logging?
Does the .Net TraceSource/TraceListener framework have something similar to log4net's Formatters?
लिंक में मैं पोस्ट किया गया, अक्सर "सर्वश्रेष्ठ" लॉगिंग की चर्चा होती है ढांचा। मैं आपको System.Diagnostics से बदलने के लिए मनाने की कोशिश नहीं कर रहा हूं। लिंक भी System.Diagnostics का उपयोग कर के बारे में अच्छी जानकारी है, यही वजह है कि मैं उन्हें पोस्ट करते हैं।
मेरे द्वारा पोस्ट किए गए कई लिंक Ukadc.Diagnostics पर एक लिंक शामिल हैं। यह System.Diagnostics के लिए लाइब्रेरी पर वास्तव में एक अच्छा जोड़ है जो लॉग 4नेट और एनएलओजी के साथ आप क्या कर सकते हैं के समान समृद्ध स्वरूपण क्षमता जोड़ता है। यह लाइब्रेरी आपके ऐप पर कॉन्फ़िगर-केवल निर्भरता लागू करती है, कोड या संदर्भ निर्भरता नहीं।
बहुत बढ़िया जवाब। धन्यवाद। :) –
एक आकर्षण की तरह काम करता है। आप नमूना .config फ़ाइल में '' तत्व खो रहे हैं। –
मैंने नोड को बंद करने के लिए जोड़ा। – wageoghe