定义筛选器

提供程序可以定义会话用于基于事件数据筛选事件的筛选器。 使用级别和关键字,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>