使用 Azure Monitor 从虚拟机收集 Windows 事件

Windows 事件日志是获得客户端操作系统健康状况和 Windows 计算机工作负载信息的最常见来源之一。 除了由需要监视的应用程序创建的任意自定义日志,还可以从标准日志(如“系统”和“应用程序”)中收集事件。 使用 数据收集规则(DCR)Windows 事件 数据源从虚拟机收集 Windows 事件日志。

有关创建 DCR 的详细信息,请参阅 使用 Azure Monitor 从 VM 客户端收集数据。 本文提供有关 Windows 事件数据源类型的其他详细信息。

注意

若要直接使用 DCR 定义或使用 ARM 模板等其他方法进行部署,请参阅 Azure Monitor 中的数据收集规则(DCR)示例

配置 Windows 事件数据源

通过使用 Azure Monitor 从虚拟机客户端收集数据中的流程创建 DCR。 在 DCR 的“收集和传递”选项卡上,从“数据源类型”下拉列表中选择“Windows 事件日志”。 从一组日志和严重性级别中进行选择以进行收集。 仅收集具有每个日志所选严重性级别的日志。

提示

如果选择 DCR 中的 安全 日志,则事件将发送到 Log Analytics 工作区中的 事件 表,其中包含来自其他日志(如系统和应用程序)的事件。 另一种选择是在工作区上启用 Microsoft Sentinel ,然后通过 AMA 连接器为 Microsoft Sentinel 启用 Windows 安全事件。 这会使用相同的 Azure Monitor 代理 并收集相同的事件,但会发送到 Sentinel 使用的 SecurityEvent 表。

显示数据收集规则中 Windows 事件数据源的配置的屏幕截图。

选择自定义以使用XPath 查询筛选事件。 这使您可以通过使用 XPath 来指定要收集的事件,从而更精细地控制您收集的事件。 有关 XPath 查询的详细信息和示例,请参阅 使用 XPath 查询筛选事件

显示数据收集规则中 Windows 事件数据源的自定义配置的屏幕截图。

添加目标

Windows 事件数据只能发送到存储在 事件 表中的 Log Analytics 工作区。 添加 Azure Monitor 日志 类型的目标并选择 Log Analytics 工作区。 虽然可以添加多个工作区,但请注意,这会向每个工作区发送重复的数据,从而产生额外的成本。

显示数据收集规则中 Azure Monitor 日志目标的配置的屏幕截图。

验证数据收集

若要验证是否正在收集数据,请检查 事件 表中的记录。 在虚拟机或 Azure 门户中的 Log Analytics 工作区中,选择 “日志 ”,然后单击“ ”按钮。 在“虚拟机”类别下,单击“事件”旁边的“运行”。

显示从事件表返回的记录的屏幕截图。

使用 XPath 查询筛选事件

Azure 门户中的基本配置提供基于日志和严重性筛选事件的有限能力。 若要指定更精细的筛选,请使用自定义配置并指定仅筛选所需事件的 XPath。

XPath 条目以 LogName!XPathQuery 形式进行编写。 例如,你可能只希望从应用程序事件日志中返回事件 ID 为 1035 的事件。 这些事件的 XPathQuery 将为 *[System[EventID=1035]]。 由于要从应用程序事件日志中检索事件,因此 XPath 为 Application!*[System[EventID=1035]]

注意

Azure Monitor 代理使用 EvtSubscribe 系统 API 订阅 Windows 事件日志。 Windows OS 不允许订阅类型为“分析”/“调试”通道的 Windows 事件日志。 因此,无法从“分析”和“调试”通道收集数据或将数据导出到 Log Analytics 工作区。

从 Windows 事件查看器提取 XPath 查询

可以使用 Windows 中的事件查看器提取 XPath 查询,如以下屏幕截图所示。

将 XPath 查询粘贴到“添加数据源”屏幕上的字段中时(如第 5 步中所示),必须附加日志类型类别,后跟感叹号 (!)。

显示在 Windows 事件查看器中创建 XPath 查询的步骤的屏幕截图。

提示

你也可以将 PowerShell cmdlet Get-WinEventFilterXPath 参数配合使用,先在计算机本地测试 XPath 查询的有效性。 有关详细信息,请参阅 Windows 基于代理的连接说明中提供的提示。 Get-WinEvent PowerShell cmdlet 最多支持 23 个表达式。 Azure Monitor 数据收集规则最多支持 20 个。 以下脚本显示了一个示例:

$XPath = '*[System[EventID=1035]]'
Get-WinEvent -LogName 'Application' -FilterXPath $XPath
  • 在前面的 cmdlet 中,-LogName 参数的值是 XPath 查询的初始部分,直到感叹号 (!)。 XPath 查询的其余部分将进入 $XPath 参数。
  • 如果脚本返回事件,则查询有效。
  • 如果收到消息“找不到任何与指定的选择条件匹配的事件。”,则查询可能有效,但在本地计算机上没有匹配的事件。
  • 如果收到消息“指定的查询无效”,则查询语法无效。

下表提供了用于筛选事件的 XPath 查询示例:

DESCRIPTION XPath
仅收集事件 ID = 4648 的系统事件 System!*[System[EventID=4648]]
收集事件 ID = 4648 且进程名称为 consent.exe 的安全日志事件 Security!*[System[(EventID=4648)]] and *[EventData[Data[@Name='ProcessName']='C:\Windows\System32\consent.exe']]
从系统事件日志中收集所有严重、错误、警告和信息事件,事件 ID 6(驱动程序已加载)除外 System!*[System[(Level=1 or Level=2 or Level=3) and (EventID != 6)]]
收集所有成功和失败安全事件,事件 ID 4624(成功登录)除外 Security!*[System[(band(Keywords,13510798882111488)) and (EventID != 4624)]]

注意

要了解 Windows 事件日志支持的 XPath 中的限制列表,请参阅 XPath 1.0 限制。 例如,可以在查询中使用“position”、“Band”和“timediff”函数,但“starts-with”和“contains”等其他函数目前不受支持。

后续步骤