在我的项目中,我使用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);
}
}
}
我通过在“Additional Providers”字段中定义“* kafka4net”来使用具有动态提供程序功能的PerfView。这将通过其名称解析提供者。工作得很好。有一个例外。我看到的事件是kafka4net / Connecting,而我想看看kafka4net / ConnectionTrace / Connecting。
一般来说,我希望事件成为产品/子系统/事件。我可以看到一些系统组件具有这种结构,例如“Microsoft-Windows-DotNETRuntime / GC / Start”。
我试图把[EventSource(Name =“kafka4net-Connection”)],但我不能在PerfView中将它用作动态事件,因为我必须枚举所有子系统,如“kafka4net-Connection,kafka4net-Fetcher “等等。这不行。
EventSource具有Name属性,该属性可以是顶级“product”,函数名称在事件名称层次结构中用作最低级别。如何在事件名称层次结构中插入中间元素“子系统”?
答案 0 :(得分:2)
这是不可能的,因为ProviderName/Event/OpCode
是在PerfView中显示事件的惯例。
Microsoft-Windows-DotNETRuntime/GC/Start
也是如此。 Microsoft-Windows-DotNETRuntime is
提供商,GC
是事件,Start
是OpCode。
您可以使用“任务”来获得更好的输出:
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中你有更好的输出: