ETW 日志记录 - 跟踪事件会话为侦听器启用多个事件提供程序

本文关键字:启用 侦听器 事件提供程序 会话 记录 日志 跟踪 事件 ETW | 更新日期: 2023-09-27 18:36:37

我正在开发一个 ETW 侦听器来侦听系统中所有可用的事件源。

问1:请在下面找到示例代码:

providerName = "ETW-TEST-APPLICATION";
sessionName = "ETW-TEST-APPLICATION";
using (var session = new TraceEventSession(sessionName, null))
{
    try
    {
        session.StopOnDispose = true;
        session.BufferSizeMB = 100;
        Console.CancelKeyPress +=
            delegate(object sender, ConsoleCancelEventArgs e) { session.Dispose(); };
        using (source = new ETWTraceEventSource(sessionName, TraceEventSourceType.Session))
        {
            var parser = new DynamicTraceEventParser(source);
            parser.AddDynamicProvider(new ProviderManifest(Environment.CurrentDirectory +
                                                           "''ETWApplicationRegister." +
                                                           providerName +
                                                           ".etwManifest.man"));
            parser.All += delegate(TraceEvent data)
            {
                Console.WriteLine("--------------------------------------------------------------");
                Console.WriteLine("ProviderName : " + data.ProviderName);
                Console.WriteLine("ProviderGuid : " + data.ProviderGuid);
                Console.WriteLine("EventID : " + data.ID);
                Console.WriteLine("Level : " + data.Level);
                Console.WriteLine("Channel : " + data.Channel);
                Console.WriteLine("Task : " + data.Task);
                Console.WriteLine("TaskName : " + data.TaskName);
                Console.WriteLine("TimeStamp : " + data.TimeStamp);
                Console.WriteLine("FormattedMessage : " + data.FormattedMessage);
                Console.WriteLine("PayLoad : " + data.PayloadByName("jsonArgs"));
                Console.WriteLine("--------------------------------------------------------------");
            };
            session.EnableProvider(providerGuid);
            source.Process(); //On execution of this statement system listens to the events
        }
    }
}

此代码适用于一个事件源,即"ETW-TEST-APPLICATION"。我希望此侦听器用于多个事件源"ETW-TEST-APPLICATION2","ETW-TEST-APPLICATION3"等。

请让我知道可用于实现此目的的选项。我尝试使用线程,但没有工作。

问2:也让我知道我是否可以进行多次会话。启用提供程序的,我只想启用信息和错误消息,但忽略警告消息会话。EnableProvider(providerGuid,TraceEventLevel.Informational);会期。EnableProvider(providerGuid,TraceEventLevel.Error);

ETW 日志记录 - 跟踪事件会话为侦听器启用多个事件提供程序

问题 1:如果多个提供程序位于一个会话中,则不需要多个 ETWTraceEventSource 来启用它们。 也就是说,如果您被迫这样做,则可能必须为每个源创建一个新的 DynamicTraceEventParser,然后将事件处理程序挂接到每个分析器。

问题 2:下面是如何通过搜索程序集启用多个提供程序的简化示例:

    void EnableAllEventSources()
    {
        foreach (var es in GetEventSourceNamesFromAssembly(GetType().Assembly);)
            _session.EnableProvider(es);
    }
    IEnumerable<string> GetEventSourceNamesFromAssembly(Assembly assembly)
    {
        return assembly.GetTypes()
            .Where(t => t.BaseType == (typeof(EventSource)))
            .Select(t => {
                var attribute = Attribute.GetCustomAttribute(t, typeof(EventSourceAttribute));
                return ((EventSourceAttribute)attribute).Name;
            });
    }