代码改变世界

WCF 第九章 诊断 额外配置选项

2011-02-22 08:28  DanielWise  阅读(1092)  评论(0编辑  收藏  举报

先前部分描述配置日志和诊断的基本方法。在这一部分,我们将描述其他几个你应该在配置你的WCF应用时注意的选项。

共享监听器

先前的例子为每个源(消息和跟踪)使用唯一的监听器。你可能选择配置一个共享监听器并连接到多个源,将输出统一为一个单独元素,比如一个XML文件。列表9.4显示如何将跟踪和消息日志配置为使用同样的输出文件。

列表9.4 向一个共享监听器跟踪并记录消息

    <system.diagnostics>
        <sources>
            <source name="System.ServiceModel" switchValue="Warning, ActivityTracing"
                propagateActivity="true">
                <listeners>
                    <add type="System.Diagnostics.DefaultTraceListener" name="Default">
                        <filter type="" />
                    </add>
                </listeners>
            </source>
            <source name="System.ServiceModel.MessageLogging" switchValue="Warning, ActivityTracing">
                <listeners>
                    <add type="System.Diagnostics.DefaultTraceListener" name="Default">
                        <filter type="" />
                    </add>
                </listeners>
            </source>
        </sources>
        <sharedListeners>
            <add initializeData="App_tracelog.svclog"
                type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
                name="diagnostics" traceOutputOptions="LogicalOperationStack, DateTime, Timestamp, ProcessId, ThreadId, Callstack">
                <filter type="" />
            </add>
        </sharedListeners>
    </system.diagnostics>

  对每个源来说,添加一个名字与共享监听器匹配的监听器。在这个情况下,我们要匹配”诊断”监听器,它将向同样的diagnostics.svclog文件写跟踪记录和消息。

消息过滤器

默认情况下,所有在<messageLogging>配置元素中确定的层次的相关消息都会被记录。然而,为了减少记录时的重复信息并减少日志文件的大小,你可能想要只减少那些与你配置的一系列规则匹配的消息。

  消息过滤器是在一条消息将被记录之前必须满足条件的XPath表达式。不满足XPath查询的消息会被排除,除了及其严重的错误消息,它们不被消息过滤器影响。

  通过向<messageLogging>中添加一个<filters>节点来确定过滤器,如列表9.5所示。

列表9.5 为消息日志添加一个过滤器

      <diagnostics>
            <messageLogging logEntireMessage="true" logMalformedMessages="true"
                logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true"
                maxMessagesToLog="4000">
                <filters>
                    <add nodeQuota="1000" 
                         xmlns:s12="http://www.w3.org/2003/05/soap-envelope" 
                         xmlns:wsa10="http://www.w3.org/2003/08/addressing"
                         /s12:Envelope/s12:Header/was10:Action[startswith(text(), 'http://Microsoft.ServiceModel.Samples/ICalculator')]></add>
                </filters>
            </messageLogging>
        </diagnostics>

  这个例子可能看起来有些复杂,但是它整个是为了定义在XPath表达式中使用的命名空间。命名空间是为了SOAP信封和寻址元数据用的。表达式检查每条消息的头来保证它会被转发给我们SelfHost 例子中ICalculator服务中的一个。其他服务的消息会被忽略。

跟踪源自动刷新

如果你想要每条跟踪记录或者消息记录操作在每次跟踪过程中自动完成(写到硬盘中),在<System.diagnostics>配置节点的<trace>元素中开启自动舒心功能,如列表9.6所示。

列表9.6 开启自动刷新功能

<trace autoflush="true" />

  自动刷新功能默认关闭。在生产环境中开启自动更新之前,要确定需要处理在一个测试环境中的影响,因为它会导致费用增加,特别是消息传输增加。

性能计数器

三种不同的WCF相关性能计数器与.NET Framework 3.5 一起安装。在性能监控器中,你可以在ServiceModelService,ServiceModelEndpoint和ServiceModelOperation下面看到这些计数器。你可以选择通过配置来为你的应用程序开启这些,在列表9.7中显示。

列表9.7 开启性能计数器更新

<diagnostics performanceCounters="ServiceOnly">
            <messageLogging 
                logMalformedMessages="true" 
                logMessagesAtServiceLevel="false"
                logMessagesAtTransportLevel="true" />
        </diagnostics>

  通过在<system.serviceModel><diagnostics>节点中包含performanceCounters属性来开启性能计数器。验证设置是Off(默认),ServcieOnly, 和All.强烈建议在开发和诊断目的下开启所有的性能计数器,但是因为性能计数器与一些需要较多费用的操作一起使用,ServiceOnly 建议在正常的生产操作中使用,这将仅开启那些在ServiceModelService 列表中的。

提示 获取性能计数器
你需要运行一个WCF服务或者客户端实例来在性能监控应用中添加性能计数器。确保性能计数器在配置文件中开启并启动你的服务,然后添加你想要获取的计数器,并接着运行你的客户端应用程序。

Windows 设备管理(WMI)

WCF支持通过WMI暴露设置和状态的功能,很多常用的应用程序管理程序,比如微软操作管理器和HP OpenView使用WMI来访问多种跨企业的系统。Windows PowerShell也有支持WMI的功能,允许你为特殊的管理和监控场景写自定义的脚本程序。

  你可以在如列表9.8的配置文件中为你的WCF应用程序开启WMI供应者服务。

列表9.8 开启WMI 供应者服务

<diagnostics wmiProviderEnabled="true" 
                     performanceCounters="ServiceOnly">
            <messageLogging logMalformedMessages="true" 
                            logMessagesAtServiceLevel="false"
                            logMessagesAtTransportLevel="true" />
        </diagnostics>

开启WMI与开启性能计数器类似。向<system.serviceModel><diagnostics>节点添加wmiProviderEnabled属性。在它被开启以后,管理程序将可以监控并管理你的WCF应用程序。