2010-11-19 109 views
4

我想將跟蹤信息保存到.svclog文件中,但僅限於失敗的請求。這可能嗎?如果是這樣,確切地說?WCF只跟蹤失敗的請求?

我有這就是所謂的每分鐘幾百次的WCF服務。在極少數情況下,客戶端會在WCF內部運行的代碼的邊界之外發生錯誤500(通常是安全問題)。我想知道這些錯誤發生的原因以及導致它們的原因。

我也真的想使用跟蹤查看器工具來檢查.svclog文件。

據我所知,我有兩個選擇: 1)通過system.webServer \ tracing設置記錄失敗請求的儀器FERB跟蹤。不幸的是,我真的不喜歡IE跟蹤查看器的界面,也沒有從跟蹤日誌中得到足夠的信息來找出爲什麼我的代碼之外出現錯誤。

2)打開下System.Diagnostics程序\跡線部分的全球跟蹤。本部分會生成很棒的跟蹤日誌,並記錄下我所需要的所有內容。但是,我無法找到一種方法來捕獲失敗請求的信息。本部分捕獲所有請求的跟蹤信息。我的跟蹤記錄很快就填滿了!

我的錯誤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> 

不幸的是可以被任意的跟蹤監聽器的記錄NOTHING。 失敗請求日誌中包含的:

-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

我會建議使用警告級別最初直到你確定了錯誤。 – softveda 2010-11-19 09:36:04

+0

@ Pratik-聽起來夠公平 - 什麼會觸發警告?我可以看到拋出一個異常將意味着一個錯誤... – 2010-11-19 09:38:57

+1

有時警告事件可能出現在實際的錯誤之前,並可以給錯誤提供額外的見解。 – softveda 2010-11-21 22:48:02

1

或者它可能至少指定EventTypeFilter作爲聽者的filter

<listeners> 
    <add name="console" 
     type="System.Diagnostics.ConsoleTraceListener" > 
     <filter type="System.Diagnostics.EventTypeFilter" 
     initializeData="Error" /> 
    </add> 
    </listeners>