2010-11-19 20 views
4

トレース情報を.svclogファイルに保存したいが、失敗したリクエストのみに保存したい。これは可能ですか?もしそうなら、いかに正確に?要求が失敗したWCFトレースのみ?

私は毎分何百回も呼ばれるWCFサービスを持っています。ごくまれに、クライアントは、WCF内で実行されているコードの境界(通常セキュリティ上の問題)の外で発生するエラー500を受け取ります。私はこれらのエラーがなぜ起こっているのか、何が起こっているのかを正確に知りたい。

また、トレースビューアツールを使用して.svclogファイルを調べることも本当に好きです。

私の知る限り、2つのオプションがあります。 1)instrument.webServer \ tracing設定で失敗したリクエストを記録することによって、FERBトレースを計測します。残念ながら、私は本当にIEのトレースビューアのインターフェイスが嫌いですし、トレースログから十分な情報を得て、なぜコード外のエラーが発生したのかわかりません。

2)system.diagnostics \ traceセクションのグローバルトレースをオンにします。このセクションでは、私が今までに望むことのできるものをすべて記録した素晴らしいトレースログを作成します。しかし、私は失敗したリクエストの情報だけをキャプチャする方法を見つけることができません。このセクションでは、すべての要求のトレース情報を取得します。私のトレースログはすぐにいっぱいです!

私のエラー500は断続的で、まれです。最終的には、私の.svclogトレースを常にONにしたいが、失敗したリクエストが発生した場合にのみ起動させる。

これが可能ならアドバイスをお願いします。

ありがとうございました!

編集:

グラハム、 私はあなたのアドバイスに従っていると私は私が期待したログが表示されません。ここでは、web.configファイルから関連セクションは、以下のとおりです。ここで

<system.diagnostics> 
    <trace> 
     <listeners> 
      <add type="Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" name="AzureDiagnostics"> 
       <filter type="" /> 
      </add> 
     </listeners> 
    </trace> 

    <sources> 
     <source name="System.ServiceModel" switchValue="Error"> 
      <listeners> 
       <add name="wcfTracing" 
         type="System.Diagnostics.XmlWriterTraceListener" 
         initializeData="Traces1.svclog"/> 
       <add name="log4netTracing" 
         type="AzureWatch.Model.Service.Log4netTraceListener,AzureWatch.Model.Service"/> 
      </listeners> 
     </source> 
     <source name="System.ServiceModel.MessageLogging" switchValue="Error"> 
      <listeners> 
       <add name="wcfTracing" 
         type="System.Diagnostics.XmlWriterTraceListener" 
         initializeData="Traces2.svclog"/> 
       <!--<add name="log4netTracing" 
         type="AzureWatch.Model.Service.Log4netTraceListener,AzureWatch.Model.Service"/>--> 
      </listeners> 
     </source> 
    </sources> 
    </system.diagnostics> 

<!-- ... --> 

     <diagnostics wmiProviderEnabled="true"> 

     <messageLogging 
      logEntireMessage="true" 
      logMalformedMessages="true" 
      logMessagesAtServiceLevel="true" 
      logMessagesAtTransportLevel="true" 
      maxSizeOfMessageToLog="1000000" 
      maxMessagesToLog="-1" /> 
    </diagnostics> 

は、WCFのクライアントエラーです:

<Exception> 
    <Type>System.Net.Sockets.SocketException</Type> 
    <Message>An existing connection was forcibly closed by the remote host</Message> 
    <StackTrace> 
     <Frame>at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)</Frame> 
    </StackTrace> 
    </Exception> 

は残念ながらトレースリスナーのいずれかによって記録されています何もありません。 失敗した要求のログはこれを含んでいます

-GENERAL_READ_ENTITY_END 
    BytesReceived 0 
    ErrorCode 2147943395 
    ErrorCode The I/O operation has been aborted because of either a thread exit or an application request. (0x800703e3) 
    Warning 
-MODULE_SET_RESPONSE_ERROR_STATUS 
    ModuleName ManagedPipelineHandler 
    Notification 128 
    HttpStatus 400 
    HttpReason Bad Request 
    HttpSubStatus 0 
    ErrorCode 0 
    ConfigExceptionInfo 
    Notification EXECUTE_REQUEST_HANDLER 
    ErrorCode The operation completed successfully. (0x0) 
    0 msInformational 

答えて

6

私は私のWCFサービスのために、以下の設定に入れてみました、そして有効および無効な資格情報を使用してサービスを打ってきました。無効な資格情報を持つ要求のみが、サービストレースファイルに何かを表示させました。私のサービスはカスタムUserNamePasswordValidatorクラスを使用しており、これはスタックトレースに存在していました。重要な部分は<source>要素にswitchValue="Error"propagateActivity="false"です。これは正確に何をしたいですが、それは、少なくとも

<system.diagnostics> 
    <sources> 
    <source name="System.ServiceModel" switchValue="Error" 
      propagateActivity="false"> 
     <listeners> 
     <add type="System.Diagnostics.DefaultTraceListener" name="Default"> 
      <filter type="" /> 
     </add> 
     <add name="ServiceModelTraceListener"> 
      <filter type="" /> 
     </add> 
     </listeners> 
    </source> 
    </sources> 
    <sharedListeners> 
    <add initializeData="C:\Path-to-log-file\Web_tracelog.svclog" 
     type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
     name="ServiceModelTraceListener" 
     traceOutputOptions="DateTime, Timestamp, Callstack"> 
     <filter type="" /> 
    </add> 
    </sharedListeners> 
    <trace autoflush="true" /> 
</system.diagnostics> 
+0

としてEventTypeFilterで指定することも可能だと確信し、私は、少なくとも警告レベルを使用することをお勧めしません最初はあなたがエラーを摘発するまで。 – softveda

+0

@ Pratik-十分に聞こえる - 何が警告を引き起こすでしょうか?例外をスローするとエラーが発生することがわかります... –

+1

時には警告イベントが実際のエラーの前に表示され、エラーをさらに詳しく知ることができます。 – softveda

1

...近いようであれば代わりにそれがリスナーのfilter

<listeners> 
    <add name="console" 
     type="System.Diagnostics.ConsoleTraceListener" > 
     <filter type="System.Diagnostics.EventTypeFilter" 
     initializeData="Error" /> 
    </add> 
    </listeners> 
関連する問題