c# - 使用 .net 检查事件日志中是否记录了事件的最简单方法是什么?

标签 c# .net testing event-log

检查一段时间内事件日志中是否记录了事件的最简单方法是什么?

我想执行一系列自动化测试步骤,然后检查是否有任何错误记录到应用程序事件日志中,忽略一些我不感兴趣的来源。我可以使用 System.Diagnostics.EventLog 然后查看条目集合,但在这种情况下似乎不是很有用。例如,如果事件日志正在删除旧条目,Entries.Count 会随着时间的推移而变小。我更喜欢某种方式来查询日志或监视它在一段时间内的变化。例如

DateTime start = DateTime.Now;
// do some stuff...
foreach(EventLogEntry entry in CleverSolution.EventLogEntriesSince(start, "Application"))
{ 
  // Now I can do stuff with entry, or ignore if its Source is one
  // that I don't care about.
  // ...
}

最佳答案

只是为了成为一名优秀的 Wiki 公民并努力完成,还有其他方法。我之前没有建议它,因为它对于仅作为测试套件的一部分在内部运行的东西来说完全是矫枉过正,而且你在标题中说你想要一些简单的东西。

但是,如果您需要查看运输代码中发生的事件,请继续阅读。信不信由你,目前这件事有三种不同的 Windows API。

通知更改事件日志()

这类事情的原始 API 称为 NotifyChangeEventLog()并且从 Windows 2000 开始支持它。基本上你使用 WIN32 event log APIs要打开事件日志,然后使用其他 API 提供的句柄和事件句柄调用此 API。当有新的事件日志条目可供查看时,Windows 将发出您的事件信号。

我自己从未使用过这个 API,因为我最感兴趣的是远程事件日志访问,而这个 API 明确不支持远程日志。但是,如果您拥有正确的权限,它所属的 API 集的其余部分确实可以让您按顺序读取远程日志。

Windows 管理规范

第二种方法是使用 Windows Management Instrumentation API ,这确实支持本地和远程日志。这是一个基于 COM/DCOM 的 API,在 Windows 中已经存在了好几年,.NET Framework 在 System.Management 中有一个很好的实现。命名空间。本质上,您所做的是创建一个 EventQuery查找 Win32_NTLogEvent 类型(在 WMI 类型系统内)的新 WMI 对象的外观.这些的出现将指示新的事件日志条目,并且它们将几乎实时呈现。这些对象的属性包含日志条目的所有详细信息。有一个article from MSDN magazine谈论在 Visual Studio 中玩这些东西。

同样,这对于测试应用程序来说完全是多余的,它需要比现有解决方案更多的代码。但是几年前,我为一个网络管理应用程序编写了一个子系统,它使用这个 API 的 DCOM 风格来收集网络上所有服务器的事件日志,以便我们可以对特定的服务器发出警报。它几乎是实时的。如果您使用 DCOM 在 C++ 中实现此功能,请准备好处理多线程单元和大量复杂的逻辑来检测您与远程服务器的连接是否/何时启动或关闭。

Windows Vista 事件日志

Windows Vista(和 Server 2008)有一个全新的与事件记录和跟踪相关的 API 套件。 new event log is documented here .似乎有一个名为 EvtSubscribe 的 API 允许您 subscribe to events .我没有使用过这个 API,所以我不能评论它的优缺点。

关于c# - 使用 .net 检查事件日志中是否记录了事件的最简单方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/182372/

相关文章:

c# - 批处理脚本在调用 exe 后错误退出

.net - 使用 Kerberos 对网站和 Web 服务进行身份验证是个好主意吗?

c# - .NET 应用程序的最佳调度程序?

ios - 无法退出不存在的沙箱帐户iOS 13.4

testing - 为什么 CircleCi 找不到我的测试?

c# - 只获取 src 值

c# - 尝试对node.js中的字符串进行AES加密以匹配.net中的加密值

c# - 在 C# 中以编程方式打开位于计算机中的 Word 文档

java - 如何在测试 android 应用程序时隐藏 LeanFT 中的键盘?

c# - 简单的正则表达式不匹配