代码之家  ›  专栏  ›  技术社区  ›  Igorek

WCF只跟踪失败的请求?

  •  4
  • Igorek  · 技术社区  · 14 年前

    我想将跟踪信息保存到.svclog文件中,但仅限于失败的请求。这可能吗?如果是,准确程度如何?

    我还想使用跟踪查看器工具来检查.svclog文件。

    据我所知,我有两个选择: 1)通过system.webServer\tracing settings记录失败的请求来检测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
    
    2 回复  |  直到 14 年前
        1
  •  6
  •   Graham Clark    14 年前

    我已尝试为我的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>
    
        2
  •  1
  •   Michael Freidgeim    11 年前

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

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