ETW日志记录驱动程序

预计阅读时间:2分钟

ETW日志记录驱动程序将容器日志作为ETW事件转发。ETW在Windows中代表事件跟踪,并且是在Windows中跟踪应用程序的通用框架。每个ETW事件都包含一条消息,其中包含日志及其上下文信息。然后,客户端可以创建ETW侦听器以侦听这些事件。

该日志记录驱动程序向Windows注册的ETW提供程序的GUID标识符为:{a3693192-9ed6-46d2-a981-f8226c8363bd}。客户端创建一个ETW侦听器并注册以侦听来自日志记录驱动程序提供程序的事件。提供程序和侦听器的创建顺序无关紧要。客户端可以创建其ETW侦听器,并在提供者已在系统中注册之前开始侦听来自提供者的事件。

用法

这是有关如何使用大多数Windows安装中包括的logman实用程序来侦听这些事件的示例:

  1. logman start -ets DockerContainerLogs -p {a3693192-9ed6-46d2-a981-f8226c8363bd} 0 0 -o trace.etl
  2. 通过添加--log-driver=etwlogs到Docker run命令,使用etwlogs驱动程序运行您的容器 ,并生成日志消息。
  3. logman stop -ets DockerContainerLogs
  4. 这将生成一个包含事件的etl文件。将此文件转换为可读格式的一种方法是运行:tracerpt -y trace.etl

每个ETW事件都包含以下格式的结构化消息字符串:

container_name: %s, image_name: %s, container_id: %s, image_id: %s, source: [stdout | stderr], log: %s

消息中每个项目的详细信息可以在下面找到:

场地 描述
container_name 启动时的容器名称。
image_name 容器图像的名称。
container_id 完整的64个字符的容器ID。
image_id 容器图像的完整ID。
source stdoutstderr
log 容器日志消息。

这是事件消息示例(为便于阅读而格式化的输出):

container_name: backstabbing_spence,
image_name: windowsservercore,
container_id: f14bb55aa862d7596b03a33251c1be7dbbec8056bbdead1da8ec5ecebbe29731,
image_id: sha256:2f9e19bd998d3565b4f345ac9aaf6e3fc555406239a4fb1b1ba879673713824b,
source: stdout,
log: Hello world!

客户端可以解析此消息字符串以获取日志消息及其上下文信息。时间戳在ETW事件中也可用。

笔记

该ETW提供程序仅发出消息字符串,而不发出特殊结构的ETW事件。因此,不需要向系统注册清单文件即可读取和解释其ETW事件。

ETW泊坞窗日志驱动