Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在ETW EventSource中定义名称层次结构?_C#_Etw_Etw Eventsource_Perfview - Fatal编程技术网

C# 如何在ETW EventSource中定义名称层次结构?

C# 如何在ETW EventSource中定义名称层次结构?,c#,etw,etw-eventsource,perfview,C#,Etw,Etw Eventsource,Perfview,在我的项目中,我使用System.Diagnostics.Tracing.EventSource,如下所示: namespace kafka4net.Tracing { [EventSource(Name = "kafka4net")] public class ConnectionTrace : EventSource { public static ConnectionTrace Log = new ConnectionTrace();

在我的项目中,我使用System.Diagnostics.Tracing.EventSource,如下所示:

namespace kafka4net.Tracing
{
    [EventSource(Name = "kafka4net")]
    public class ConnectionTrace : EventSource
    {
        public static ConnectionTrace Log = new ConnectionTrace();

        public void Connecting(string host, int port)
        {
            Log.WriteEvent(1, host, port);
        }

        public void Connected(string host, int port)
        {
            Log.WriteEvent(2, host, port);
        }
    }
}
我通过在“其他提供程序”字段中定义“*kafka4net”,将PerfView与动态提供程序功能结合使用。这将根据其名称解析提供程序。很好用。只有一个例外。我看到的事件是kafka4net/Connecting,而我希望看到kafka4net/ConnectionTrace/Connecting

一般来说,我希望事件是产品/子系统/事件。我可以看到一些系统组件具有这种结构,例如“Microsoft Windows DotNETRuntime/GC/Start”

我试图将[EventSource(Name=“kafka4net Connection”)]放入PerfView中,但无法将其用作动态事件,因为我必须枚举所有子系统,如“kafka4net Connection,kafka4net Fetcher”等,这是行不通的


EventSource具有Name属性,该属性可以是顶级“产品”,函数名用作事件名称层次结构中的最低级别。如何在事件名称层次结构中插入中间元素“subsystem”?

这无法做到,因为
ProviderName/event/OpCode
是在PerfView中显示事件的惯例

Microsoft Windows DotNETRuntime/GC/Start
也遵循这一点
Microsoft Windows DotNETRuntime是
提供程序,
GC
是事件,
Start
是操作码

您可以使用任务获得更好的输出:

public class Tasks
{
    public const EventTask Connect = (EventTask)0x1;
}

[EventSource(Name = "kafka4net")]
public sealed class ConnectionTrace : EventSource
{
    public static ConnectionTrace Log = new ConnectionTrace();

    [Event(1, Task = Tasks.Connect, Opcode = EventOpcode.Start)]
    public void Connecting(string host, int port)
    {
        if (Log.IsEnabled())
        {
            Log.WriteEvent(1, host, port);
        }
    }

    [Event(2, Task = Tasks.Connect, Opcode = EventOpcode.Stop)]
    public void Connected(string host, int port)
    {
        if (Log.IsEnabled())
        {
            Log.WriteEvent(2, host, port);
        }
    }
}
在PerfView中,您可以获得更好的输出:


我看不到Tasks.Connect和输出之间的关系。@FrankHileman
Tasks.Connect
只是将两个事件连接在一起
EventSource
似乎采用它找到的第一个连接方法的名称,并将其作为清单中的
任务
输出。因此,这两种方法有一个
任务
。与
操作码
s相结合,将产生
/Connecting/Start
/Connecting/Stop
的PerfView事件名称。两者都作为事件存在于清单中,但链接到单个任务。