gpt4 book ai didi

c# - 读取 Hyper-V 事件日志

转载 作者:太空宇宙 更新时间:2023-11-03 12:52:19 25 4
gpt4 key购买 nike

作为我们使用的监控系统的一部分,我需要能够检索 Hyper-V 的事件日志条目。目前我使用 VBScript 和 WMI 并执行如下操作:

query = "Select * from Win32_NTLogEvent where LogFile = 'System' and TimeGenerated >= '" & last_check & "'"
set wmi_objectset = wmi_service.ExecQuery(query, "WQL", &h30)

这工作正常,但它只检索部分 Hyper-V 日志,而不是全部。一些谷歌搜索表明没有办法解决这个问题,而且 MS 还没有构建将所有 Hyper-V 日志读取到 WMI 中的能力。所以我需要一种不同的方法。

更多 谷歌搜索找到了一些用于读取事件日志的 C# 代码,这会很好,因为我很乐意使用 C# 而不是 VBScript。问题是,虽然我可以阅读标准日志,如 SystemApplication,但我无法弄清楚如何阅读我想要的 Hyper-V 日志。代码如下:

eventLog = new EventLog();
eventLog.Log = eventLogName;

foreach (EventLogEntry log in eventLog.Entries)
{

如果我将 eventLogName 设置为“系统”,那么它会工作并读回所有日志条目(而且速度非常快)。但我需要的是日志 Microsoft-Windows-Hyper-V-VMMS-Admin 中的条目。如果我将 eventLogName 设置为“Microsoft-Windows-Hyper-V-VMMS-Admin”,我会得到一个异常:

Unhandled Exception: System.InvalidOperationException: The event log 'Microsoft-Windows-Hyper-V-VMMS-Admin' on computer '.' does not exist.

日志确实存在,PowerShell命令:

Get-WinEvent -LogName Microsoft-Windows-Hyper-V-VMMS-Admin

确实检索了事件,因此问题可能只是为 EventLog 对象指定日志名称的正确方法。

所以我的问题只是在我的 C# 程序中使用什么来获取 Hyper-V VMMS 管理日志中的条目。

我正在测试的服务器是 2012R2,但我认为问题与 Windows 的确切版本无关。还有其他获取日志数据的方法,例如 Get-WinEvent 或 wevtutil,但我更愿意让 C# 程序正常工作,使用替代方法将是最后的手段。

最佳答案

发生这种情况是因为 System.Diagnostics.EventLog 仅支持“旧式”事件日志。 “新样式”事件日志是您在“应用程序和服务日志”下的事件查看器中看到的那些(然后是它的子文件夹,而不是直接在其中的子文件夹),它不支持读取那些。要阅读这些内容,您需要使用 System.Diagnostics.Eventing.Reader 中提供的类.请注意,它们具有不同的界面,更适合实时事件检索。示例代码:

using (var reader = new EventLogReader("Microsoft-Windows-Hyper-V-VMMS-Admin")) {
EventRecord eventRecord;
while ((eventRecord = reader.ReadEvent()) != null) {
Console.WriteLine("{0:s} {1}", eventRecord.TimeCreated, eventRecord.FormatDescription());
}
}

如果您对最新事件特别感兴趣,以相反的顺序查询它们并以这种方式过滤它们会更有效。使用一个小的枚举器助手,我们可以在 LINQ 中使用:

IEnumerable<EventRecord> ReadEventsReverse(string logName) {
using (
var reader = new EventLogReader(
new EventLogQuery(logName, PathType.LogName) { ReverseDirection = true }
)
) {
EventRecord eventRecord;
while ((eventRecord = reader.ReadEvent()) != null) {
yield return eventRecord;
}
}
}

然后

var reverseEvents = ReadEventsReverse("Microsoft-Windows-Hyper-V-VMMS-Admin");
var reverseEventsToday = reverseEvents.TakeWhile(e => e.TimeCreated >= DateTime.Now.Date);
foreach (var eventRecord in reverseEventsToday) {
Console.WriteLine("{0:s} {1}", eventRecord.TimeCreated, eventRecord.FormatDescription());
}

如果您对阅读新事件特别感兴趣,使用 the overload 会更高效允许您提供 bookmark因此您不会不断地重新阅读和过滤旧事件。

关于c# - 读取 Hyper-V 事件日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35105444/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com