C# 如何使用System.Diagnostics以编程方式设置源开关
我遇到需要从System.Workflow.Activities.Rules捕获跟踪的情况。目前,我在代码中配置了一个自定义跟踪列表器:C# 如何使用System.Diagnostics以编程方式设置源开关,c#,.net,trace,system.diagnostics,C#,.net,Trace,System.diagnostics,我遇到需要从System.Workflow.Activities.Rules捕获跟踪的情况。目前,我在代码中配置了一个自定义跟踪列表器: _traceListener = new InMemoryTraceListener(); System.Diagnostics.Trace.Listeners.Add(_traceListener); 在app.config中,我将源开关配置为: <?xml version="1.0" encoding="utf-8" ?> &
_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 framework中的现有源配置一个开关,以便可以侦听跟踪消息。我猜您正在查找该类并执行类似操作
TraceSource mySource = new TraceSource("MySource");
mySource.Listeners.Add(new InMemoryTraceListener());
我已经改编了一些代码,我遇到了类似的事情。它通过非公共方法上的反射设置开关。这不是最佳实践,但还有其他更好的方法吗
#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,而不是侦听来自.net framework源的跟踪消息?这是一种很棒的方法(hacky是的,但仍然如此),我正在尝试使用SignalR,但跟踪是其中的实例属性,因此,我可能需要找到实例化的TraceSources。所以这个解决方案很接近,但并不总是足够