.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
?
Что такое прослушиватель трассировки по умолчанию, почему он так медленно, почему он обычно удаляется, и если он так плохо, почему он по умолчанию?
Ответы
Ответ 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", но это не нужно и в любом случае НЕ правильно, потому что вы хотите декларативно указать, куда должна идти трассировка.