2013-04-22 11 views
6

Ho 2 servizi WCF che sto ospitando da un singolo host di Windows. Io uso trace listener che registra i dati nei registri delle applicazioni. Ho aggiunto il seguente codice nel file di configurazione.Utilizzo di più di un listener di traccia

<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> 

Tutti i registri di entrambi i servizi sono visualizzati sotto il nome ReaderServiceLog di origine. Quello che voglio fare è che i log di ciascun servizio dovrebbero apparire sotto un diverso nome sorgente.

Ad esempio, i registri da ReaderService devono essere visualizzati sotto il nome ReaderServiceLog e i registri da InfoService devono essere visualizzati in InfoServiceLog. Ho modificato la mia configurazione come la seguente.

<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> 

e utilizzato questo codice:

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

Ma non funziona. Non registra nulla.

Ho anche provato this. Ma non funziona.

<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> 

ho usato lo stesso codice C# come sopra. Questo codice esegue correttamente la registrazione, ma ancora, è sotto lo stesso nome per entrambi i servizi. cioè ServiceLog.

Mi manca qualcosa qui? O c'è un altro modo per aggirare. Si prega di aiutare

+0

hai visto [questo] (http://stackoverflow.com/questions/805154/defining-multiple-tracesources-not-running)? –

+0

sì, ho visto questo e l'ho provato anche io. Ma è lo stesso di quello che avevo prima. – Newbee

+0

vedi le modifiche ... – Newbee

risposta

2

Questa configurazione aggiunge 2 diverse origini di analisi (con gli ascoltatori di file; Si consiglia di cambiare ascoltatori e percorso di directory, se volete):

<?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> 

e di utilizzarlo definire la TraceSource:

static TraceSource dataSource = new TraceSource("DataSource"); 
static TraceSource errorSource = new TraceSource("ErrorSource"); 

di lavorare più facilmente (per alcuni scenari) con un TraceSource ho scritto un metodo di estensione:

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); 
} 

Questo ha funzionato per me.

Ma non è possibile classificare TraceSource in un dominio app in base al blocco di codice che lo chiama.

Problemi correlati