此博客在此处:The EventSource NuGet package and support for the Windows Event Log (Channel Support) 有一个指向罕见的 EventSource User's Guide 文档的链接,该文档声明如下:
请务必使用 EventSourceAttribute 的 Name 属性来提供
ETW 事件提供程序的描述性限定名称,由
你的事件源。默认是您的事件源的短名称
类型,这很容易导致冲突,因为 ETW 提供程序名称共享
一个机器范围的命名空间。一个好的提供者名称的例子
“<CompanyName>-<Product>-<Component>”。按照这个 3 元素
约定将确保事件查看器以
逻辑文件夹层次结构:“Application and Services
Logs/<CompanyName>/<Product>/<Component>”。
这往往表明破折号更像是一种约定而不是严格的要求(所以我相信你可以自己解析它)。请注意,该博客仍对 cmets 开放。
对于不匹配的名称,有一个未记录的 EvtIntGetClassicLogDisplayName 函数可以让您在事件查看器中显示名称。以下是如何将它与会话和日志名称一起使用:
static void Main(string[] args)
{
var session = new EventLogSession();
foreach (string name in session.GetLogNames())
{
Console.WriteLine(GetDisplayName(session, name));
}
}
这里是支持代码(因为它没有记录,使用风险自负,而且它似乎主要用于这个“OAlert”条目,所以我不确定它是否值得):
public static string GetDisplayName(EventLogSession session, string logName)
{
var sb = new StringBuilder(512);
int bufferUsed = 0;
if (EvtIntGetClassicLogDisplayName(GetSessionHandle(session).DangerousGetHandle(), logName, 0, 0, sb.Capacity, sb, out bufferUsed))
return sb.ToString();
return logName;
}
private static SafeHandle GetSessionHandle(EventLogSession session)
{
return (SafeHandle)session.GetType().GetProperty("Handle", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(session);
}
[DllImport("wevtapi.dll", CharSet = CharSet.Unicode)]
private static extern bool EvtIntGetClassicLogDisplayName(IntPtr session, [MarshalAs(UnmanagedType.LPWStr)] string logName, int locale, int flags, int bufferSize, [MarshalAs(UnmanagedType.LPWStr)] StringBuilder displayName, out int bufferUsed);