WCF跟踪只有失败的请求?

时间:2010-11-19 04:12:31

标签: wcf trace tracing svctraceviewer

我想将跟踪信息保存到.svclog文件中,但仅用于失败的请求。这可能吗?如果是这样,有多精确?

我有一个每分钟被调用数百次的WCF服务。在极少数情况下,客户端将获得在WCF内部运行的代码边界之外发生的错误500(通常是安全问题)。我想知道为什么会发生这些错误以及造成这些错误的原因。

我还想使用Trace Viewer工具检查.svclog文件。

据我所知,我有两种选择: 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>

不幸的是,任何一个跟踪侦听器都记录了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

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:1)

或者,可以将EventTypeFilter指定为侦听器的filter

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