我遇到需要从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框架中的现有源配置交换机,以便我可以侦听跟踪消息。
答案 0 :(得分:0)
我猜您正在寻找TraceSource (MSDN)课程并执行类似
的操作TraceSource mySource = new TraceSource("MySource");
mySource.Listeners.Add(new InMemoryTraceListener());
答案 1 :(得分:0)
我已经调整了一些我遇到的类似代码的代码。它通过非公共方法的反射设置开关。这不是最佳做法,但还有另一种更好的方法吗?
#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