如何使用系统诊断以编程方式设置源开关

本文关键字:设置 开关 方式 编程 何使用 系统诊断 | 更新日期: 2023-09-27 18:33:14

我遇到需要从System.Workflow.Activities.Rules捕获跟踪的情况。 目前,我在代码中配置了一个自定义跟踪列表器:

    _traceListener = new InMemoryTraceListener();
    System.Diagnostics.Trace.Listeners.Add(_traceListener);

在 app.config 中,我按如下方式配置了源开关:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.diagnostics>
    <switches>
      <add name="System.Workflow.Activities.Rules" value="Information"/>
    </switches>
  </system.diagnostics>
</configuration>

这有效,我能够在自定义跟踪侦听器中捕获竞争消息。 我需要跟踪信息,因为它对整个解决方案至关重要,并且设置在所需的级别。

但是,由于我需要以编程方式配置交换机,而不是通过配置,因为它将进入 GAC 的 dll。

我已经用SourceSwitch和TraceSource尝试了许多不同的东西,但没有一个对我有用。

编辑:总之,我想以编程方式为.net框架中的现有源配置开关,以便我可以侦听跟踪消息。

如何使用系统诊断以编程方式设置源开关

我已经改编了一些我遇到的类似事情的代码。它通过对非公共方法的反射来设置开关。这不是最佳实践,但有没有其他更好的方法?

 #region Dodgy dodgy hackery. There has to be a better way of doing this ....
 var trace = typeof(System.Workflow.Activities.StateActivity)
                .Assembly
                .GetType("System.Workflow.Activities.WorkflowActivityTrace");
 var rules = trace.GetProperty("Rules", BindingFlags.NonPublic | BindingFlags.Static)
                .GetValue(null, null)
                as System.Diagnostics.TraceSource;
 rules.Switch.Level = System.Diagnostics.SourceLevels.Information;
 rules.Listeners.Clear();
 rules.Listeners.Add(_traceListener);
 #endregion

我猜你正在寻找 TraceSource (MSDN) 类并做类似的事情

TraceSource mySource = new TraceSource("MySource");
mySource.Listeners.Add(new InMemoryTraceListener());