2013-04-22 5 views
6

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

<system.diagnostics> 
<switches> 
    <add name="ReaderService.Switch" value="4"/> 
    <add name="InfoService.Switch" value="4"/> 
</switches> 
<trace autoflush="false" indentsize="4"> 
    <listeners> 
    <add name="EventLogTraceListener" 
     type="System.Diagnostics.EventLogTraceListener" 
     initializeData="ReaderServiceLog" /> 
    </listeners> 
</trace> 
</system.diagnostics> 

दोनों सेवाओं के सभी लॉग स्रोत ReaderServiceLog नाम के अंतर्गत दिखाई देते हैं। मैं क्या करना चाहता हूं, प्रत्येक सेवा से लॉग अलग स्रोत नाम के तहत दिखाई देना चाहिए।

उदाहरण के लिए, रीडर सेवा से लॉग को नाम के तहत प्रकट होना चाहिए ReaderServiceLog और InfoService से लॉग जानकारी InfoServiceLog के अंतर्गत दिखाई देनी चाहिए। मैंने अपनी कॉन्फ़िगरेशन को निम्न की तरह संशोधित किया।

<system.diagnostics> 
<switches> 
    <add name="ReaderService.Switch" value="4"/> 
    <add name="InfoService.Switch" value="4"/> 
</switches> 
<sources> 
    <source name="EventLogTraceListener"> 
    <listeners> 
     <add name="EventLogTraceListener" 
     type="System.Diagnostics.EventLogTraceListener" 
     initializeData="ReaderServiceLog" /> 
    </listeners> 
    </source> 
    <source name="InfoService"> 
    <listeners> 
     <add name="EventLogTraceListener" 
     type="System.Diagnostics.EventLogTraceListener" 
     initializeData="InfoServiceLog" /> 
    </listeners> 
    </source> 
</sources> 
</system.diagnostics> 

और इस कोड का इस्तेमाल किया:

private TraceSource ts = new TraceSource("InfoService"); 
ts.TraceInformation(outputMessage, aslErrorText); 
ts.Flush(); 

लेकिन यह काम नहीं करता। यह कुछ भी लॉग नहीं करता है।

मैंने this भी कोशिश की। लेकिन यह काम नहीं करता है।

<system.diagnostics> 
<switches> 
    <add name="ReaderService.Switch" value="4"/> 
    <add name="InfoService.Switch" value="4"/> 
</switches> 
<sources> 
    <source name="ReaderService" 
      switchValue="Information, ActivityTracing"> 
    <listeners> 
     <add name="EventLogTraceListener"/> 
    </listeners> 
    </source> 
    <source name="InfoService" 
      switchValue="Information, ActivityTracing"> 
    <listeners> 
     <add name="EventLogTraceListener"/>    
    </listeners> 
    </source> 
</sources> 
<sharedListeners> 
    <add name="EventLogTraceListener" 
     type="System.Diagnostics.EventLogTraceListener" 
     initializeData="ServiceLog" /> 
</sharedListeners> 

मैं उपर दिए गए सी # कोड का इस्तेमाल किया। यह कोड लॉगिंग ठीक से करता है, लेकिन फिर से, यह दोनों सेवाओं के लिए समान नाम के तहत है। यानी सेवा लॉग।

क्या मुझे यहां कुछ याद आ रही है? या चारों ओर कोई और रास्ता है। कृपया मदद

+0

क्या आपने [यह] देखा है (http://stackoverflow.com/questions/805154/defining-multiple-tracesources-not-running)? –

+0

हाँ मैंने इसे देखा है और मैंने इसे भी आजमाया है। लेकिन जैसा कि मैंने पहले किया था वैसा ही था। – Newbee

+0

संपादन देखें ... – Newbee

उत्तर

2

इस config 2 अलग ट्रेस सूत्रों कहते हैं (फ़ाइल श्रोताओं के साथ; यदि आप चाहें तो श्रोताओं और निर्देशिका पथ को बदलने के लिए चाहते हो सकता है):

<?xml version="1.0"?> 
<configuration> 
    ... 
    <system.diagnostics> 
    <switches> 
     <add name="data" value="All" /> 
     <add name="error" value="All" /> 
    </switches> 
    <sources> 
     <source name="DataSource" switchName="data" switchType="System.Diagnostics.SourceSwitch"> 
     <listeners> 
      <clear /> 
      <add name="dataListener" type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" 
      initializeData="FileLogWriter" 
      Append="true" 
      AutoFlush="true" 
      BaseFileName="data" 
      CustomLocation="D:\Log\App\Data" 
      DiskSpaceExhaustedBehavior="DiscardMessages" 
      Encoding="Unicode" 
      IncludeHostName="false" 
      LogFileCreationSchedule="Daily" 
      location="Custom" 
      MaxFileSize="900000000000" /> 
     </listeners> 
     </source> 
     <source name="ErrorSource" switchName="error" switchType="System.Diagnostics.SourceSwitch"> 
     <listeners> 
      <clear /> 
      <add name="errorListener" type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" 
      initializeData="FileLogWriter" 
      Append="true" 
      AutoFlush="true" 
      BaseFileName="error" 
      CustomLocation="D:\Log\App\Error" 
      DiskSpaceExhaustedBehavior="DiscardMessages" 
      Encoding="Unicode" 
      IncludeHostName="false" 
      LogFileCreationSchedule="Daily" 
      location="Custom" 
      MaxFileSize="900000000000" /> 
     </listeners> 
     </source> 
    </sources> 
    <trace autoflush="true"> 
     <listeners> 
     <clear /> 
     <add name="defaultListener" type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" 
      initializeData="FileLogWriter" 
      Append="true" 
      AutoFlush="true" 
      BaseFileName="program" 
      CustomLocation="D:\Log\App\Program" 
      DiskSpaceExhaustedBehavior="DiscardMessages" 
      Encoding="Unicode" 
      IncludeHostName="false" 
      LogFileCreationSchedule="Daily" 
      location="Custom" 
      MaxFileSize="900000000000" /> 
     <add name="programConsoleListener" type="System.Diagnostics.ConsoleTraceListener" /> 
     </listeners> 
    </trace> 
    </system.diagnostics> 
    ... 
</configuration> 

और यह आपके TraceSource परिभाषित उपयोग करने के लिए:

public static void WriteLine(this TraceSource source, object o) 
{ 
    var str = (o ?? string.Empty).ToString(); 

    if (source.Listeners == null || source.Listeners.Count == 0) throw new InvalidOperationException(string.Format("TraceSource named {0} has no listeners", source.Name)); 

    foreach (TraceListener listener in source.Listeners) 
     listener.WriteLine(str); 
} 
:
static TraceSource dataSource = new TraceSource("DataSource"); 
static TraceSource errorSource = new TraceSource("ErrorSource"); 

एक TraceSource मैं एक विस्तार विधि लिखे से और अधिक आसानी से (कुछ परिदृश्यों के लिए) काम करने के लिए

यह मेरे लिए काम किया।

लेकिन आप इसे कॉल करने वाले कोड ब्लॉक के आधार पर एक ऐप डोमेन में TraceSource को वर्गीकृत नहीं कर सकते हैं।

संबंधित मुद्दे