在我的项目中,我使用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属性,该属性可以是顶级“产品”,而函数名用作事件名称层次结构中的最低级。如何在事件名称层次结构中插入中间元素“子系统”?

最佳答案

无法执行此操作,因为ProviderName/Event/OpCode是在PerfView中显示事件的约定。

Microsoft-Windows-DotNETRuntime/GC/Start也遵循此规则。 Microsoft-Windows-DotNETRuntime is提供者,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中,您可以得到更好的输出:

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

关于c# - 如何在ETW EventSource中定义名称层次结构?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27662766/

10-11 06:43