WCF跟踪只有失败的请求?

Igo*_*rek 4 wcf trace svctraceviewer

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

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

我还想使用跟踪查看器工具来检查.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>
Run Code Online (Sandbox Code Playgroud)

这是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>
Run Code Online (Sandbox Code Playgroud)

遗憾的是,任何一个跟踪侦听器都记录了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
Run Code Online (Sandbox Code Playgroud)

Gra*_*ark 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>
Run Code Online (Sandbox Code Playgroud)