4

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

毎分何百回も呼び出される WCF サービスがあります。まれに、WCF 内で実行されているコードの境界の外側で発生するエラー 500 がクライアントに表示されることがあります (通常はセキュリティの問題)。これらのエラーが発生する理由とその原因を正確に知りたいです。

また、Trace Viewer ツールを使用して .svclog ファイルを調べたいと思っています。

私が知る限り、2 つのオプションがあります。1) system.webServer\tracing 設定を介して失敗した要求をログに記録することにより、FERB トレースを計測します。残念ながら、私は IE トレース ビューアーのインターフェイスが好きではありません。また、コード外でエラーが発生した理由を理解するのに十分な情報をトレース ログから取得することもできません。

2) system.diagnostics\trace セクションでグローバル トレースをオンにします。このセクションでは、必要なすべてがキャプチャされた優れたトレース ログが生成されます。ただし、失敗したリクエストの情報のみをキャプチャする方法が見つかりません。このセクションは、すべてのリクエストのトレース情報をキャプチャします。トレース ログがすぐにいっぱいになります。

私のエラー 500 は断続的でまれです。最終的には、常に .svclog トレースをオンにしたいのですが、失敗したリクエストが発生した場合にのみ開始するようにします。

これが可能かどうかアドバイスをお願いします。

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

編集:

グラハム、あなたのアドバイスに従いましたが、予期したログが表示されません。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
4

2 に答える 2

6

WCFサービスに次の構成を入れてみましたが、有効な資格情報と無効な資格情報でサービスをヒットしました。無効な資格情報を持つリクエストのみが、サービストレースファイルに何かを表示させました。私のサービスはカスタムUserNamePasswordValidatorクラスを使用していますが、これはスタックトレースに存在していました。重要な部分は、要素内のswitchValue="Error"とです。これがまさにあなたが望むものであるかどうかはわかりませんが、少なくとも近いようです...propagateActivity="false"<source>

<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>
于 2010-11-19T09:23:02.463 に答える
1

別の方法として、EventTypeFilter をリスナーのフィルターとして指定することもできます。

  <listeners>
    <add name="console" 
      type="System.Diagnostics.ConsoleTraceListener" >
      <filter type="System.Diagnostics.EventTypeFilter" 
        initializeData="Error" />
    </add>
  </listeners>
于 2013-02-17T01:40:19.627 に答える