前言随着WCF越来越多地被应用到实际系统中,其优势也越来越多地被大家所接受。但是WCF作为一种典型的分布式应用,也具有分布式应用固有的弊病,那就是开发和维护相对比较复杂。特别是在错误排查方面,比非分布式程序要复杂很多。那么怎么样才能更有效地排查WCF中发生的错误呢?这就不得不提到WCF的Trace Log功能。本文将在以IIS 6.0作为Host的WCF服务为实例谈谈Trace Log的应用。
在开始之前,先一起来认识两个朋友:SvcConfigEditor 和 SvcTraceViewer。
【SvcConfigEditor】:微软提供的用来辅助编辑WCF配置文件的工具。(当然也可以直接编辑Config文件,但是用工具方便一些。)
【SvcTraceViewer】:微软提供的用来查看WCF的Trace Log的工具。
它们两个的路径都是 C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin。
配置Config文件以启用Trace Log启动SvcConfigEditor.exe,能看到如下界面:
附件:
wcftracelog01_thumb.jpg 通过File —> Open —> Config File打开所要编辑的Config文件。(web.Config文件),选中Diagnostics节点,显示如下:
附件:
wcftracelog02_thumb.jpg 上图显示的配置是.NET默认的配置,因为Trace Log功能默认是关闭的。
简单介绍一下上面的选项:
Performance Counter:共有三种形式Off(Default)、ServiceOnly、All,这个是和系统的性能监视工具(perfmon.exe)结合使用的,在WCF性能调优的使用使用的到,本文将不讨论。
WMI Provider:该选项允许WCF将Trace Log记入到Windows Management Instrumentation (WMI)中,查看需要装WMI CIM Studio,不讨论。
Log Auto Flush:可以让应用程序关闭时Log自动输出。
MessageLogging:这个选项可以记录WCF的所有的消息,可以记录Soap消息的主体,也可以将整个消息全部记录下来。有三个级别:Malformed、Service和Transport。
Tracing:这个选项可以记录WCF服务和客户端的所有交互信息,共有六个记录级别:Off、Critical、Error、Warning、Information和Verbose。
其中MessageLogging和Tracing是本文讨论的重点。
点击Enable MessageLogging和Enable Tracing。
附件:
wcftracelog03_thumb.jpg 对于MessageLogging,修改其Log Level为Transport,并点击ServiceModelMessageLoggingListener,修改Log相关设置。
附件:
wcftracelog04_thumb.jpg 对于Tracing,Trace Level保持默认的Warning即可,如果想了解相信过程,可以设置为Information级别,但是需要注意的是,Trace的Log文件增长的非常快,要考虑服务器硬盘空间的承受能力,最好仅在错误排查时使用。
点击ServiceModelTraceListener,修改Log相关设置。
附件:
wcftracelog05_thumb.jpg 如果想记录Soap消息的所有内容,可以通过MessageLogging来配置,如下图:
附件:
wcftracelog06_thumb_1.jpg 将LogEntireMessage设置为True即可以记录Soap消息的所有内容。同时,可以针对需要修改MaxMessagesToLog和MaxSizeOfMessageToLog。
OK,大功告成,File —> Save保存一下,重启一下IIS。
利用SvcTraceViewer来查看Trace Log当上述设置都弄好后,利用客户端程序访问一下WCF服务,就可以在设置的路径(即文中的C:\ServiceLogs)中看到Log文件了。下面到了SvcTraceViewer大显身手的时候了。
查看Message Log打开SvcTraceViewer,如下:
附件:
wcftracelog07_thumb_1.jpg 先来看Message Log,使用SvcTraceViewer打开C:\ServiceLogs底下的Web_messages.svclog文件,如下:
附件:
wcftracelog08_thumb.jpg 从上图中可以很清楚地看出客户端调用了哪些服务的哪些函数,花费了多少时间。
选中一个Activity,可以看到在Description中有两条记录,这就是客户端请求的Soap消息和服务器端返回给客户端的Soap消息。
附件:
wcftracelog09_thumb.jpg 通过上图中圈出的Soap消息的Body部分,可以很清楚地看到客户端过来的请求。同样,我们也可以看服务器返回的Soap消息。
附件:
wcftracelog10_thumb.jpg 这里因为我把返回的内容做了序列化和压缩,如果没有这些,能够很清楚地看到返回的内容。
查看Trace Log其实大部分时间排错还是要通过Trace Log,让我们打开C:\ServiceLogs底下的Web_tracelog.svclog文件,如下:
附件:
wcftracelog11_thumb.jpg 通过Trace Log,我们可以查看客户端和Service服务器详细的交互过程,也就比较容易地排查错误了,如下图,我们可以定位到错误发生的交互。
附件:
wcftracelog12_thumb.jpg 在XML中包含了我们所需的很多信息,像错误内容和错误的StackTrace信息。
到此为止就结束了,基本上通过Trace Log,能排查WCF服务中发生的绝大部分错误,希望对大家有所帮助。
文/ghost_boy 出处/博客园