7

単一の Windows ホストからホストしている 2 つの WCF サービスがあります。データをアプリケーション ログに記録するトレース リスナーを使用します。次のコードを構成ファイルに追加しました。

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

しかし、うまくいきません。何も記録しません。

私もこれを試しました。しかし、うまくいきません。

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

ここで何か不足していますか?または他の方法はありますか。助けてください

4

1 に答える 1

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 を呼び出しているコード ブロックに基づいて、1 つのアプリ ドメインに分類することはできません。

于 2013-05-14T08:08:24.723 に答える