Подтвердить что ты не робот

.NET Tracing: что такое прослушиватель "Default"?

Каждый пример трассировки в .NET-сообществах удаляет прослушиватель "Default":

<configuration>
  <system.diagnostics>
    <sources>
      <source name="TraceSourceApp" switchName="SourceSwitch" switchType="System.Diagnostics.SourceSwitch">
        <listeners>
          <add name="ConsoleListener"/>
          <add name="ETWListener"/>
          <remove name="Default"/>
        </listeners>

Что такое По умолчанию, и почему он по умолчанию?

Парень Microsoft сделал тесты накладных расходов с разными слушателями:

Default                    |===============================14,196 ms=====/ /================> 
TextWriterTraceListener    |=========211 ms======>
EventProviderTraceListener |=> 77ms

Что такое прослушиватель трассировки Default, и почему это так медленно? Это OutputDebugString? Является OutputDebugString действительно на два порядка медленнее, чем запись в файл?

Есть там .NET TraceListener, который просто использует OutputDebugString?

Что такое прослушиватель трассировки по умолчанию, почему он так медленно, почему он обычно удаляется, и если он так плохо, почему он по умолчанию?

4b9b3361

Ответ 1

Из этого сообщения в блоге не видно, как был запущен код, но DefaultTraceListener документируется следующим образом:

По умолчанию методы Write и WriteLine передают сообщение функции Win32 OutputDebugString и методу Debugger.Log. Информацию о функции OutputDebugString см. В SDK платформы или MSDN.

Итак, если Debugger.Log на самом деле печатает в окне пользовательского интерфейса (и, возможно, прокручивает его и т.д.), я вижу, что это приводит к значительному замедлению.

Ответ 2

Работа слушателей трассировки, кажется, немного автоматична, потому что документация не очень ясна по этому поводу. Допустим, у нас есть бизнес-кейс для разработки службы Windows. В этом сервисе мы используем операторы Trace.Writeline для отправки информации на консоль или в файл. Прослушиватель трассировки по умолчанию отправляет информацию на консоль. Если вы запустите службу Windows и подключитесь с помощью отладчика к работающему процессу, вы увидите эти сообщения на своей консоли. Если вы хотите изменить это и отправить информацию о трассировке в файл, вы можете изменить ее в файле app.config следующим образом:

<system.diagnostics>
    <trace autoflush="false" indentsize="4">
        <listeners>
           <remove name="Default" />
           <add name="Default" type="System.Diagnostics.TextWriterTraceListener" initializeData="ImportServiceOutput.log" />      
        </listeners>
     </trace>
</system.diagnostics>

Посмотрите на name = "Default", которое может быть любым именем "myListener" также хорошо. Поскольку прослушиватель "По умолчанию" был удален, он будет использован вместо этого. Microsoft должна задокументировать это, потому что это не ясно. В документации Microsoft говорится, что вам следует использовать переменную "myListener", но это не нужно и в любом случае НЕ правильно, потому что вы хотите декларативно указать, куда должна идти трассировка.