Windows事件追踪入门与使用方式

系统 Windows
虽然大多数Windows开发者都知道Windows事件追踪(Event Tracing for Windows,ETW)是一个日志记录和事件追踪工具,但是许多管理员却从没听说过它,只是简单地认为ETW不过是操作系统提供的事件日志记录与追踪功能的一部分。ETW在内核中运行,可以追踪用户模式应用程序、操作系统内核和内核模式设备驱动引发的事件。

虽然大多数Windows开发者都知道Windows事件追踪(Event Tracing for Windows,ETW)是一个日志记录和事件追踪工具,但是许多管理员却从没听说过它,只是简单地认为ETW不过是操作系统提供的事件日志记录与追踪功能的一部分。ETW在内核中运行,可以追踪用户模式应用程序、操作系统内核和内核模式设备驱动引发的事件。

一些操作系统核心组件和第三方应用程序使用Windows事件追踪来提供事件日志记录和追踪。虽然在Windows2000中***次发布时,Windows事件追踪只有在Windows检查版本中才能使用,但现在它已经是所有Windows版本的内置工具。

Windows事件追踪(ETW)入门

在Windows服务器故障诊断和排错方面,一直就没有多少信息可以参考。管理员总是竭尽所能四处寻找各种可能的信息来确定故障。所以就有了诸如进程监视器、进程资源管理器、性能监视器(PerfMon)和性能分析日志(PAL)等多种工具来帮助我们获取远多于事件日志的信息,但不幸的是,有时候我们还需要更多的信息。

ETW无需额外的设备就可以收集足够的信息,而且有诸多优点。例如:

  • 使用非页面池的每处理器内核缓冲区,这样不会受到应用程序崩溃和挂起的影响
  • 极低的CPU消耗
  • 适用用于X86、X64和IA64的系统架构
  • 无需重启应用程序就能启动和关闭追踪

Windows事件追踪似乎是个伟大的工具,但是使用此工具有个另一个问题,没有图像界面或者用户向导。而且,在输出可分析的结果之前,需要做一些初始化工作。

为了输出有效的结果,您需要一个消费者(consumer)。在Windows Serer中生成一个名为Tracerpt.exe的消费者。正如您所知道的,Tracerpt命令的特点就是可以提供特定的输出格式,所以重要的是能熟练掌握Tracerpt和Logman这些工具,它们是Windows 2003 及以后系统的内置工具,如Windows 7和Vista。

同样重要的是理解ETW的架构。如图显示,控制器用于启动和停止一个追踪对话。在windows Server 2003 和2008中,控制器工具是Logman.exe。

Windows事件追踪,ETW
图1.ETW架构

Windows Server 2003还包含返回特定事件的一小部分事件提供者,其中包括下面的这些活动目录相关的提供者:

  • Active Directory: Core
  • Active Directory: Kerberos
  • Active Directory: SAM
  • Active Directory: NetLogon

例如,指定Active Directory: Kerberos作为提供者只会返回Kerberos特定事件。

Windows版本不同,事件提供者也有所不同。例如,Windows Server 2003有22个提供者, Windows 2008有387个。它提供了更强大的追踪和更多的追踪范围。然而,当涉及LDAP流量时,作为提供者的 Active Directory: Core对于两个Windows版本来说基本上是一样的。

您也能捆绑多个事件提供者到一个追踪中。因为上面例子上提到了Kerberos身份验证,所以我在这里仍然使用Active Directory: Kerberos和Active Directory: Core提供者举例,同时使用Logman命令和参数-PL,如下面的例子所示:
Logman Create Trace CoreKerb –pf c:\etw\input.txt –o c:\etw\coreKerb

参数-pf 的意思是读一个输入文本文件(如本例中的input.txt)。其格式如图2所示。

Windows事件追踪,ETW
图2.输入文本文件格式#p#

我们已经认识到了什么是事件追踪,那么下面我们就来了解如何使用Windows事件追踪(ETW)

通过例子来介绍ETW是***办法。最近有位工程师告诉我他需要知道活动目录如何响应提交给域控制器的Unix客户端身份验证LDAP请求。他使用Unix命令去查看在Unix端绑定请求,也希望在Windows端能有类似的输出结果,输出显示如下:

[23/Sep/2010:15:04:44 +0200] conn=31 fd=65 slot=65 connection from 10.50.20.173 to 10.50.12.119
[23/Sep/2010:15:04:44 +0200] conn=31 op=0 BIND dn="uid=dorsa,ou=people,o=Corp.net" method=128 version=3
[23/Sep/2010:15:04:44 +0200] conn=31 op=0 RESULT err=0 tag=97 nentries=0 etime=0 dn="uid=dorsa,ou=people,o=corp.net"
[23/Sep/2010:15:04:44 +0200] conn=31 op=1 SRCH base="ou=people,o=hp.com" scope=2 filter="(|(uid=dorsa)(cn=mdilln.dodgcty))" attrs=ALL
[23/Sep/2010:15:04:44 +0200] conn=31 op=1 RESULT err=0 tag=101 nentries=2 etime=0
[23/Sep/2010:15:04:44 +0200] conn=31 op=2 UNBIND
[23/Sep/2010:15:04:44 +0200] conn=31 op=2 fd=65 closed - U1
[23/Sep/2010:15:04:44 +0200] conn=29 op=-1 fd=64 closed error 11 (Resource temporarily unavailable) -

为了得到这个输出结果,我打开NTDS Diagnostics 注册表键,它位于HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NTDS\Diagnostics,同时把LDAP Interface值设为5.这仅提供了运行的操作时间,和Unix输出还没有太大关系,所以我决定试试ETW。因为使用Windows Server 2003,所以我使用Active Directory: Core提供者,它能提供详细的LDAP信息。

以下步骤和命令用于创建一个ETW追踪和生成日志。这些命令能为这位Unix工程师保存身份验证过程中的LDAP数据。同时,我在C盘下创建ETW文件夹来存储所有的数据。

1.C:>Logman Query Providers --该命令列出所有可用的提供者。注意,我们希望能得到LDAP的信息,所以使用的提供者是Active Directory: Core。

2.Logman create trace “LDAP1” –p “Active Directory: core” –o c:\etw\LDAP1 LDAP1 --这是追踪的名字(可以在追踪列表里找到它)。

  • -identifies指定Active Directory: Core 作为提供者
  • -o指定输出文件(后缀名为.etl)路径C:\etw\ldap1。输出文件将保存为LDAP1_000001.etl。请注意,当追踪第二次运行时,输出文件将被命名为LDAP1_000002.etl,以此类推。

3.一旦Logman create trace追踪命令成功执行,您就可以使用命令:C:>Logman Query在命令队列中看到此命令。在图3中, LDAP1追踪显示在红色方框内。请注意这些追踪我已经设置为可以随时启动和停止以重复使用。

Windows事件追踪,ETW
图三. ETW 追踪

4.启动追踪命令如下:

Logman Start LDAP1

此时使用Logman Query将会显示LDAP1为正在运行

5.然后,我们需要使用复制操作来复制想追踪的问题或事件。在这个例子中,我执行了一个登录和运行一些LDIFDE命令来执行LDAP搜索。一旦这些命令执行完,应该尽快启动追踪这样可以最小的减少追踪的误差和更加容易读取。

6.接下来,使用命令Logman Stop LDAP1来停止追踪

7.在C:\ETW目录下显示LDAP1追踪文件LDAP1_000002.etl已被创建:

C:\ETW>dir ldap1*
Volume in drive C has no label.
Volume Serial Number is 309D-BA04
Directory of C:\ETW
10/13/2010 04:22 PM     1,015 ldap1
10/13/2010 04:20 PM     262,144 LDAP1_000001.etl
01/21/2011 02:12 AM     262,144 LDAP1_000002.etl

8.因为是第二次运行追踪,所以文件被命名为000002。

由于后缀名为.etl的日志文件不可读,我们可以使用Tracerpt命令得到一些有用的数据。该命令的例子如下:
TRACERPT LDAP1_000001.etl -o Ldap1.csv

  • -of设置文件类型(默认为CSV)(如需更多格式,请查看在线帮助。)
  • -o表示输出文件名为默认,其名称为dumpfile.csv和产生最令人感兴趣的LDAP活动存储
  • -Summary, -Report表示统计数据(本例子没有使用)

使用Excel(或者记事本)打开LDAP1.csv文件来查看数据。如图4显示, LDAP请求和响应被高亮显示。 正如您看到的,搜索和绑定请求在列A,同时在列B中,您能看到成对出现的开始和结束请求。在右边您还能看到用户数据和LDAP请求的过滤和范围及其他相关信息。

Windows事件追踪,ETW
图4.LDAP1.csv数据

ETW令人兴奋的一点就是有数不尽的提供者。提供者包括组策略、Kerberos、LDAP客户端、Netlogon、FSRM、IIS,而在Windows Server 2008中,除了上面提到的之外,还有更多的提供者。

虽然过去我一直都使用事件日志和类似的日志文件,但现在我使用Windows事件追踪获得更深层次且详细的信息帮我解决我遇到的任何问题。非常简单的命令用于追踪和生成报表。当然,您可以通过网络发现更多的命令项和更详细的信息。

【编辑推荐】

  1. Windows Server 林功能级别详解
  2. Windows Server崩溃的三大常见诱因与避免方式
  3. Windows Server 2008用户权限管理
  4. Windows Server 2008 R2:入门
  5. Windows Server2008提升信息化水平案例分析
责任编辑:张浩 来源: TT中国
相关推荐

2015-09-07 14:08:32

Java编程异步事件

2020-02-07 11:15:30

Windows 10快捷方式Windows

2010-06-22 10:30:13

2018-11-14 10:20:15

SonarQube开源追踪代码

2020-12-16 09:24:18

Skywalking分布式链路追踪

2010-01-22 14:28:24

使用C++

2024-02-01 12:38:22

事件流事件溯源系统

2023-07-31 07:07:25

2023-12-29 08:33:17

2011-07-27 09:57:24

SQL TraceOracle

2021-10-06 09:46:17

trace-cmd追踪内核Linux

2009-12-17 09:22:00

2013-08-15 16:44:25

2009-02-17 19:02:33

2023-11-10 12:55:00

消息代理事件代理

2009-02-17 18:01:30

2019-06-14 11:15:27

WindowsLinuxWSL

2010-01-12 18:12:58

VB.NET事件

2019-12-13 09:45:38

Windows 10PowerToysWindows

2019-12-04 14:30:43

事件日志Windows 10Windows
点赞
收藏

51CTO技术栈公众号