Можно ли отключить трассировку для отдельной сборки, на которую ссылается мой код?
У меня есть определенные рамки кода, и у меня есть TraceListener, определенный по двум причинам:
- Обратная совместимость со многими старыми журналами, которые были сделаны через Trace.Write до тех пор, пока мы не обновим их, и
- Приятно иметь возможность обрабатывать другие сборки нашими ссылками на код, если это необходимо.
Тем не менее, у меня есть одна сборка (не наша), которая регистрирует множество бессмысленных данных, которые не помогают нам ничего отлаживать. Как я могу отключить трассировку для этой единственной сборки (или, альтернативно, проекта фасада, который мы построили вокруг него), оставив его включенным для остальной части приложения?
Я пробовал разные варианты конфигурации в нашем проекте фасада, обычно это выглядело следующим образом, но безрезультатно. Я пытался добавить <remove>
элементы, которые соответствуют <add>
элементы которые настраивают логирование в первую очередь, пробовали <clear>
их настройки <trace enabled="false">
и как минимум три другие попытки. Спасибо за любую помощь, вы можете предоставить!
<system.diagnostics>
<trace autoflush="true" indentsize="4">
<listeners>
<clear/>
</listeners>
</trace>
<switches>
</switches>
</system.diagnostics>
2 ответа
Вы можете написать свой собственный фильтр трассировки для использования с вашим TraceListener. Внутри этого фильтра вы можете найти свою сборку в stackTrace и отключить трассировку событий.
В моем случае я написал фильтр (см.: DotNetOpenAuthFilter) на основе EventTypeFilter, который фильтрует события только из библиотеки DotNetOpenAuth.
Затем подключите фильтр к слушателю в файле web.config:
<configuration>
<system.diagnostics>
<trace>
<listeners>
<add name="console" type="System.Diagnostics.ConsoleTraceListener" >
<filter type="Common.Log.DotNetOpenAuthFilter, Common" initializeData="Warning" />
</add>
</listeners>
</trace>
</system.diagnostics>
</configuration>
Используйте TraceSource.
Инициализируйте его в вашем источнике трассировки.
TraceSource logger = new TraceSource("Class1");
Назовите это из критических точек в коде:
logger.TraceInformation("Hello from Class1");
Обязательно отредактируйте конфигурацию вашего приложения:
<system.diagnostics>
<trace autoflush="true"/>
<sources>
<source name="Class1" switchName="Class1Switch" switchType="System.Diagnostics.SourceSwitch">
<listeners>
<add name="console"></add>
<add name="csv" />
<!-- or you can add your own listener here -->
</listeners>
</source>
</sources>
<switches>
<add name="Class1Switch" value="Information" />
</switches>
<sharedListeners>
<add name="console" type="System.Diagnostics.ConsoleTraceListener" />
<add name="csv" type="System.Diagnostics.DelimitedListTraceListener"
delimiter="|" initializeData="d:\data\tracing\trace.log"
traceOutputOptions="Timestamp, ThreadId, LogicalOperationStack, DateTime, ProcessId">
</add>
</sharedListeners>
</system.diagnostics>
Если, скажем, вы хотите регистрировать только ошибки, измените переключатель:
<add name="Class1Switch" value="Error" />
Чтобы полностью отключить его:
<add name="Class1Switch" value="Off" />