定义筛选器
提供程序可以定义会话用于基于事件数据筛选事件的筛选器。 使用级别和关键字,ETW 确定事件是否写入日志。 但是,使用筛选器时,提供程序使用控制会话传递给它的筛选数据条件, (查看 EnableCallback 函数) ,以确定它是否将事件写入该会话。 仅当 ETW 跟踪会话启用提供程序时,筛选器才适用。
通常,提供程序只编写事件,会话使用级别和关键字标识它想要的事件类型。 如果提供程序为事件类型定义了数据筛选器,则会话可以使用它根据事件数据筛选出该事件类型的事件, (提供程序) 定义筛选器的语义。 例如,如果提供程序生成进程事件,则可以定义基于进程标识符筛选进程事件的数据筛选器。 然后,会话可以将进程标识符作为筛选器数据传递给提供程序,并仅接收该进程标识符的进程事件。
以下示例演示如何使用 filter 元素定义筛选器。 必须指定筛选器 的名称 和 值 属性;其他属性是可选的。 如果筛选器要求会话传递筛选器数据,则 tid 属性是必需的。
<instrumentationManifest
xmlns="http://schemas.microsoft.com/win/2004/08/events"
xmlns:win="http://manifests.microsoft.com/win/2004/08/windows/events"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
<instrumentation>
<events>
<provider name="Microsoft-Windows-SampleProvider"
guid="{1db28f2e-8f80-4027-8c5a-a11f7f10f62d}"
symbol="PROVIDER_GUID"
resourceFileName="<path to the exe or dll that contains the metadata resources>"
messageFileName="<path to the exe or dll that contains the string resources>"
message="$(string.Provider.Name)">
. . .
<filters>
<filter name="Pid"
value="1"
tid="t1"
symbol="FILTER_PID"/>
</filters>
<templates>
<template tid="t1">
<data name="Pid" inType="win:UInt32"/>
</template>
</templates>
. . .
</provider>
</events>
</instrumentation>
<localization>
<resources culture="en-US">
<stringTable>
<string id="Provider.Name" value="Sample Provider"/>
</stringTable>
</resources>
</localization>
</instrumentationManifest>