1

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

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

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

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

为什么这个坏了?有没有办法获得“真实”的事件源列表?

4

2 回答 2

3

'LogName' 是 'Application','Source Name' 是 '.NET Runtime',所以看起来你没有正确查询。

尝试:

var logCheckOne = EventLog.SourceExists(".NET Runtime") 
于 2021-03-16T18:52:53.597 回答
1

您所看到的 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 时,您会感到困惑,EventLogSession 是 ETW 提供程序及其配置的通道的混合体,这些通道仍然可以记录到应用程序事件日志中。

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

            foreach(var log in EventLog.GetEventLogs())
            {
                Console.WriteLine($"{log.LogDisplayName}");
            }
  • 应用
  • 硬件事件
  • IE浏览器
  • 安全
  • 系统

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

于 2021-03-16T19:12:48.967 回答