2013-04-22 7 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

Вы видели [это] (http://stackoverflow.com/questions/805154/defining-multiple-tracesources-not-running)? –

+0

да, я видел это, и я тоже попробовал. Но то же самое, что и раньше. – Newbee

+0

посмотреть изменения ... – Newbee

ответ

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:

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

Чтобы работать более легко (для некоторых сценариев) с 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); 
} 

Это сработало для меня.

Но вы не можете классифицировать TraceSource в одном домене приложения на основе кода, который его вызывает.

Смежные вопросы