WCF отслеживание ТОЛЬКО неудачных запросов? - PullRequest
4 голосов
/ 19 ноября 2010

Я хочу сохранить информацию трассировки в файлы .svclog, но только для неудачных запросов.Это возможно?Если да, то как именно?

У меня есть служба WCF, которая вызывается сотни раз в минуту.В редких случаях клиенты получат ошибку 500, которая происходит за пределами моего кода, работающего внутри WCF (обычно это проблемы безопасности).Я хотел бы точно знать, почему эти ошибки происходят и что их вызывает.

Я также хотел бы использовать инструмент Trace Viewer для проверки файлов .svclog.

НасколькоЯ могу сказать, у меня есть два варианта: 1) инструмент FERB отслеживания путем регистрации неудачных запросов через system.webServer \ настройки трассировки.К сожалению, мне действительно не нравится интерфейс IE trace-viewer, и при этом я не получаю достаточно информации из журналов трассировки, чтобы выяснить, почему произошла ошибка за пределами моего кода.

2) turnо глобальной трассировке в разделе 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 ]

6 голосов
/ 19 ноября 2010

Я попытался вставить следующую конфигурацию для моей службы 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 голос
/ 17 февраля 2013

В качестве альтернативы можно указать EventTypeFilter как фильтр слушателя

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