定义通道
事件可以写入事件日志通道和/或事件跟踪日志文件。 通道基本上是收集事件的接收器。 如果事件的目标受众使用事件使用者(如 Windows 事件查看器),则必须定义新通道来收集事件或导入其他提供程序定义的现有通道。
若要定义自己的通道,请使用 channel 元素。 若要定义导入的通道,请使用 importChannel 元素。 在导入的通道或定义的通道的任意组合中,最多可以指定八个通道。
通道必须是以下四种类型之一:管理员、操作、分析和调试。 每个频道类型都有一个目标受众,用于确定你写入频道的事件类型。 有关每种类型的说明,请参阅 ChannelType 复杂类型。
若要指定将事件写入到的通道,请将事件定义的 通道 属性设置为与通道定义的 chid 属性相同的值。 事件一次只能写入一个通道,但也可由最多 7 个其他 ETW 会话同时收集。
以下示例演示如何导入通道。 必须设置 chid 和 name 属性。 chid 属性唯一标识通道 - 通道列表中的每个通道标识符必须是唯一的。 将 name 属性设置为提供程序在定义通道时使用的相同名称。
<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)">
<channels>
<channel chid="c1"
name="Microsoft-Windows-BaseProvider/Admin"
symbol="CHANNEL_BASEPROVIDER_ADMIN"
type="Admin"/>
</channels>
. . .
</provider>
</events>
</instrumentation>
<localization>
<resources culture="en-US">
<stringTable>
<string id="Provider.Name" value="Microsoft-Windows-SampleProvider"/>
</stringTable>
</resources>
</localization>
</instrumentationManifest>
尽管 Winmeta.xml 定义了可以导入的旧通道,但除非支持旧版使用者使用旧版通道中的事件, (例如应用程序或系统) ,否则不应使用它们。 Winmeta.xml文件包含在 Windows SDK 中。
以下示例演示如何定义通道。 必须设置 chid、 name 和 type 属性。 chid 属性唯一标识通道 - 通道列表中的每个通道标识符必须是唯一的。 将 chid 属性设置为提供程序列出的通道的唯一值;通道标识符在一个或多个事件定义中引用。 命名通道的约定是使用提供程序名称和通道类型,格式为 providername/channeltype。
<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)">
<channels>
<importChannel chid="c1"
name="Microsoft-Windows-BaseProvider/Admin"
symbol="CHANNEL_BASEPROVIDER_ADMIN"
/>
<channel chid="c2"
name="Microsoft-Windows-SampleProvider/Operational"
type="Operational"
enabled="true"
/>
</channels>
. . .
</provider>
</events>
</instrumentation>
<localization>
<resources culture="en-US">
<stringTable>
<string id="Provider.Name" value="Microsoft-Windows-SampleProvider"/>
</stringTable>
</resources>
</localization>
</instrumentationManifest>