【问题标题】:WCF tracing of ONLY failed requests?WCF 仅跟踪失败的请求?
【发布时间】:2010-11-19 04:12:31
【问题描述】:

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

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

我也很想使用 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>

不幸的是,任何一个跟踪侦听器都没有记录任何内容。 失败的请求日志包含以下内容:

-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

【问题讨论】:

    标签: wcf trace svctraceviewer


    【解决方案1】:

    我已尝试为我的 WCF 服务添加以下配置,并使用有效和无效凭据访问该服务。只有具有无效凭据的请求才会导致服务跟踪文件中出现任何内容。我的服务使用了一个自定义的 UserNamePasswordValidator 类,它出现在堆栈跟踪中。重要的部分是&lt;source&gt; 元素中的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>
    

    【讨论】:

    • 我建议至少在最初使用警告级别,直到您确定错误为止。
    • @Pratik- 听起来很公平 - 什么会触发警告?我可以看到抛出异常意味着错误......
    • 有时警告事件会出现在实际错误之前,并且可以为错误提供额外的见解。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-03
      • 2015-02-06
      • 1970-01-01
      • 2018-12-16
      • 2013-11-20
      • 1970-01-01
      • 2011-04-28
      相关资源
      最近更新 更多