2013-04-22 54 views
6

我有2個WCF服務,我從一臺Windows主機託管。我使用跟蹤監聽器將數據記錄到應用程序日誌中。我已將以下代碼添加到配置文件中。使用多個跟蹤監聽器

<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名稱下。我想要做的是,來自每個服務的日誌應顯示在不同的源名稱下。

例如,來自ReaderService的日誌應顯示在名稱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> 

我用與上述相同的C#代碼。此代碼正確執行日誌記錄,但同樣,這兩個服務的名稱都是相同的。即ServiceLog。

我在這裏錯過了什麼嗎?或者有沒有其他解決方法。 請幫助

+0

你見過[this](http://stackoverflow.com/questions/805154/defining-multiple-tracesources-not-running)嗎? – 2013-04-22 13:07:36

+0

是的,我看到了這一點,我也嘗試過。但它與我之前的相同。 – Newbee 2013-04-22 14:02:03

+0

查看編輯... – Newbee 2013-04-22 14:02:25

回答

2

這個配置增加了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分類到一個應用程序域中。