4

我想将跟踪信息保存到 .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
4

2 回答 2

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>
于 2010-11-19T09:23:02.463 回答
1

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

  <listeners>
    <add name="console" 
      type="System.Diagnostics.ConsoleTraceListener" >
      <filter type="System.Diagnostics.EventTypeFilter" 
        initializeData="Error" />
    </add>
  </listeners>
于 2013-02-17T01:40:19.627 回答