.NET 运行时未显示在 LogNames 中

.NET Runtime does not show up in LogNames

有谁知道为什么“.NET 运行时”事件源的行为不像普通事件源?

var logCheckOne = EventLog.Exists(".NET Runtime");

var logCheckTwo = EventLogSession
                    .GlobalSession
                    .GetLogNames()
                    .Any(s => string.Equals(s, ".NET Runtime", StringComparison.OrdinalIgnoreCase));

这两行代码 return 错误,但在事件查看器中,显然有一个“.NET 运行时”事件源,我可以毫无问题地写入它。

为什么这个坏了?有没有办法获得 'true' 事件源列表?

'LogName' 是 'Application','Source Name' 是 '.NET Runtime',看来你查询的不正确。

尝试:

var logCheckOne = EventLog.SourceExists(".NET Runtime") 

你所看到的 EventLog 实际上是一个复杂的野兽,它由许多 ETW(Windows 的事件跟踪)提供程序组成。 代码

foreach(var log in EventLogSession.GlobalSession.GetLogNames())
{
 Console.WriteLine($"{log}");
}

为您提供超过 1000 个条目。这是具有不同通道设置的 ETW 提供程序,自 Windows Vista 以来显示为“新”事件日志。 在 Windows Vista 之前只有事件日志

  • 申请
  • 安全
  • 系统

可能还有一些其他应用程序创建的自定义日志。数据进入 .evt 文件,其中每个事件日志都在注册表中注册了事件源及其资源 dll,用于消息格式化和本地化。

自 Vista 及更高版本以来,这已被重新设计,现在“旧的”基于注册表的方法仍然存在,但大多数事件日志源在注册表中不再是消息 dll,而是对 ETW 提供程序 ID 的引用现在正在查找。

因此,当您枚举 EventLogSession 时,您会感到困惑,它是 ETW 提供程序及其配置通道的混合体,仍然可以记录到应用程序事件日志。

带有 EventLog 及其方法的美好旧世界显示了带有日志名称和来源的“旧”Vista 之前的视图。

            foreach(var log in EventLog.GetEventLogs())
            {
                Console.WriteLine($"{log.LogDisplayName}");
            }
  • 申请
  • 硬件事件
  • Internet Explorer
  • 安全
  • 系统

有关详细信息,请参阅我的文章 https://aloiskraus.wordpress.com/2020/07/20/ms-performance-hud-analyze-eventlog-reading-performance-in-realtime/