我使用Microsoft.Diagnostics.Tracing.EventSource nuget版本1.1.28发出ETW事件,并使用Microsoft.Diagnostics.Tracing.TraceEvent nuget版本1.0.41动态跟踪事件。我尝试做的是过滤事件ID将跟踪的事件,我似乎无法使其工作,所以我创建了一个简单的测试项目来测试它在使用.NET Framework 4.6版的Windows 10 Enterprise计算机上
我的活动源代码:
[EventSource(Name = ProviderName)]
public sealed class EtwDemoEventSource : EventSource
{
private static Lazy<EtwDemoEventSource> instance = new Lazy<EtwDemoEventSource>(() => new EtwDemoEventSource());
public const string ProviderName = "EtwDemoEventSource";
private EtwDemoEventSource() { }
public static EtwDemoEventSource Log
{
get
{
return instance.Value;
}
}
[Event(1, Message = "Foo event raised.")]
public void FooEvent()
{
WriteEvent(1);
}
[Event(2, Message = "Bar event raised.")]
public void BarEvent()
{
WriteEvent(2);
}
}
我有一个控制台应用程序使用事件源发出这些事件:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Start emitting events.");
EtwDemoEventSource.Log.FooEvent();
EtwDemoEventSource.Log.BarEvent();
Console.WriteLine("Finish emitting events.");
Console.ReadLine();
}
}
另一个跟踪事件的应用程序:
class Program
{
static void Main(string[] args)
{
using (var session= new TraceEventSession("EtwTraceEventSession"))
{
Console.WriteLine("Start collecting events.");
session.Source.Dynamic.All += te => Console.WriteLine(te.FormattedMessage);
session.EnableProvider(EtwDemoEventSource.ProviderName, options: new TraceEventProviderOptions { EventIDsToEnable = new int[] { 1 } });
Console.CancelKeyPress += (sender, cargs) => session.Stop();
session.Source.Process();
Console.WriteLine("Finish collecting events.");
}
}
}
如果你看一下跟踪应用程序中的EnableProvider方法,我发现TraceEventProviderOptions有一个EventIDsToEnable属性,它似乎适合我的用例,但运行带有该代码的跟踪应用程序(首先我运行跟踪应用程序,然后发出事件的应用程序)不会产生跟踪的事件。如果我删除了TraceEventProviderOptions,那么所有事件都会被正确跟踪,如果我使用EventIDsToDisable属性,它也会按预期工作。
我在假设EventIDsToEnable属性应该如何影响事件过滤时出错(我似乎无法找到很多文档)或者我应该以不同的方式使用它吗?