#事件记录 #跟踪记录 #事件 #etw #提供者 #Windows事件 #元数据

win_etw_metadata

为win_etw_provider和win_etw_macros提供元数据定义

3个版本

0.1.2 2023年4月6日
0.1.1 2020年6月18日
0.1.0 2020年5月21日

#8 in #windows-event

Download history 327/week @ 2024-04-23 194/week @ 2024-04-30 228/week @ 2024-05-07 168/week @ 2024-05-14 273/week @ 2024-05-21 346/week @ 2024-05-28 263/week @ 2024-06-04 213/week @ 2024-06-11 225/week @ 2024-06-18 251/week @ 2024-06-25 175/week @ 2024-07-02 364/week @ 2024-07-09 218/week @ 2024-07-16 211/week @ 2024-07-23 252/week @ 2024-07-30 205/week @ 2024-08-06

943 个月下载量
9 个crate中使用了(直接使用4个)

Apache-2.0 OR MIT

24KB
129

Rust对Windows事件跟踪(ETW)的支持

提供了#[trace_logging_provider]宏,该宏允许您定义一个用于跟踪日志提供者,以与Windows事件跟踪(ETW)框架一起使用。

此宏仅适用于针对Windows的目标。针对其他平台时,此宏仍然有效,但将生成不执行任何操作的代码。

此框架允许应用程序记录结构化事件,而不是文本字符串。ETW分析工具可以可靠地识别您事件中的字段,并将它们作为强类型数据而不是文本字符串来处理。

有关使用ETW的tracing的说明,请参阅tracing-etw

如何创建和使用事件提供者

在ETW中,事件提供者是一个生成事件的软件对象。事件控制器设置事件记录会话,而事件消费者读取和解释事件数据。此crate侧重于使应用程序能够创建事件提供者

添加crate依赖项

将这些依赖项添加到您的Cargo.toml文件中

[dependencies]
win_etw_macros = "0.1.*"
win_etw_provider = "0.1.*"

win_etw_macros包含生成事件代码的过程宏。win_etw_provider包含由win_etw_macros生成的代码所调用的库代码。

为您的事件提供者创建一个新的GUID

您必须为每个事件提供者分配一个新的唯一GUID。ETW使用此GUID来识别由您的提供者生成的事件。Windows包含许多事件提供者,因此能够选择仅由您的应用程序生成的事件非常重要。此GUID还由ETW内部使用来识别事件元数据(字段类型),因此您的GUID必须是唯一的。否则,使用相同GUID的冲突来源的事件可能会被错误解释。

有许多可以创建GUID的工具,例如

  • 在Visual Studio中,在“工具”菜单中选择“创建GUID”。
  • 从Visual Studio命令行运行 uuidgen.exe
  • 在Ubuntu shell中运行 uuidgen

许多用于处理事件的工具期望提供者的GUID基于提供者的名称,并且此技术由Microsoft推荐。生成与这些工具兼容的GUID的方法包括

  • PowerShell: [System.Diagnostics.Tracing.EventSource]::new("YourProviderName").Guid
  • Visual Studio 2022:从“调试”菜单中选择“性能分析器”。点击“事件查看器”旁边的齿轮图标。在“附加提供者”下,输入您的“提供者名称”,“提供者GUID”将自动填写。
  • 在TraceView中,从“文件”菜单中选择“创建新日志会话”。选择“手动输入控制GUID或哈希名称”并输入 * 后跟您的提供者名称(例如,*YourProviderName)。然后,点击“确定”。在“格式信息源选择”窗口中,选择“自动”并点击“确定”。GUID将显示。
  • 有关其他工具和代码,请参阅这篇StackOverflow帖子

定义事件提供者和其事件

将特性定义添加到您的源代码中,并使用您刚才创建的GUID使用宏 #[trace_logging_provider(guid = "...")] 进行注释。特性定义仅用作过程宏的输入;特性不会输出到您的crate中,也不能用作正常特性。

ETW提供者名称在ETW元数据中基于特性名称。这可以通过在提供者属性中显式指定名称来覆盖,例如 #[trace_logging_provider(name = "YourNameHere")]

在特性定义中添加方法签名。每个方法签名定义一个事件类型。每个方法参数定义事件类型的字段。仅支持有限数量的字段类型(以下列出)。

#[trace_logging_provider]] 消耗特质定义并生成相同名称和相同方法签名的 struct 定义。 (特质 可用于普通特质。)

# use win_etw_macros::trace_logging_provider;
#[trace_logging_provider(guid = "... your guid here ...")]
pub trait MyAppEvents {
    fn http_request(client_address: &SockAddr, is_https: bool, status_code: u32, status: &str);
    fn database_connection_created(connection_id: u64, server: &str);
    fn database_connection_closed(connection_id: u64);
    // ...
}

创建事件提供者实例

在初始化时间(在你的 fn main() 等),创建事件提供者的一个实例

let my_app_events = MyAppEvents::new();

你的应用程序在每个进程中只能创建每个事件提供者的一个实例。也就是说,你应该创建一个事件提供者的一个实例,并在整个进程中共享它。通常,实例存储在静态变量中,使用惰性/原子赋值。有许多crate和类型支持这种用法模式。

调用事件方法来报告事件

要报告一个事件,请调用事件提供者上定义的一个方法。该方法将调用ETW来报告事件,但无法保证事件被存储或转发;如果事件缓冲区资源稀缺,事件可能会丢失。

my_app_events.client_connected(None, &"192.168.0.42:6667".parse(), false, 100, "OK");

注意,所有生成的事件方法都有一个添加的第一个参数,options: Option<&EventOptions>。此参数允许你覆盖每个事件的参数,例如事件级别和事件相关性ID。在大多数情况下,你应该传递 None

支持的字段类型

仅支持有限集合的字段类型。

  • 64位以下的整型原语:i8i16i32i64u8u16u32u64
  • 浮点型原语:f32f64
  • 架构依赖的大小:usizeisize
  • 布尔值:bool
  • 所有支持原语的切片:&[u8]&[u16] 等。
  • Windows FILETIME。类型必须声明为 正好FILETIME;类型别名或完全限定的路径(例如 winapi::shared::minwindef::FILETIME将不起作用。生成的代码中的参数类型将是 win_etw_provider::FILETIME,这是一个基于 u64 的新类型。
  • std::time::SystemTime受到支持,但必须精确地声明为SystemTime;类型别名或完全限定的路径(例如std::time::SystemTime)将不会生效。
  • SockAddrSockAddrV4SockAddrV6受到支持。它们必须精确地按照所示声明,不能使用完全限定的名称或类型别名。

如何捕获和查看事件

有多种工具可以用来捕获和查看ETW事件。最简单的工具是Windows SDK中的TraceView工具。通常它安装在以下路径:C:\Program Files (x86)\Windows Kits\10\bin\10.0.<xxxxx>.0\x64\traceview.exe,其中<xxxxx>是Windows SDK的发布号。

运行TraceView,然后选择“文件”,然后“创建新日志会话”。选择“手动输入GUID或哈希名称”并输入您为事件提供者分配的GUID。点击确定。下一个对话框将提示您选择WPP格式信息的来源;选择自动并点击确定。

此时,TraceView应正在捕获(您分配的GUID)的事件并实时显示它们,无论事件由哪个进程报告。

这些工具也可以用来捕获ETW事件

  • Windows性能记录器 此工具旨在捕获系统级的事件流。它对于捕获特定事件提供者的事件没有用。
  • logman 是一个用于管理事件的命令行工具。
  • Tracelog

还有其他工具,如Windows性能记录器,可以捕获ETW事件。

改进建议

  • 更好的处理每个事件的覆盖,而不是使用Option<&EventOptions>

参考资料

贡献

此项目欢迎贡献和建议。大多数贡献都需要您同意贡献者许可协议(CLA),声明您有权并且实际上确实授予我们使用您贡献的权利。有关详细信息,请访问https://cla.opensource.microsoft.com

在您提交拉取请求时,CLA机器人将自动确定您是否需要提供CLA,并相应地装饰PR(例如,状态检查,注释)。只需遵循机器人提供的说明即可。您只需在整个使用我们CLA的repo中进行一次。

此项目已采用Microsoft开源行为准则。有关更多信息,请参阅行为准则常见问题解答或联系[email protected]以获取任何其他问题或评论。

依赖项

~105KB