トレース情報を .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