我可以通过编程方式控制WCF跟踪吗?

时间:2011-10-17 14:56:44

标签: .net wcf trace

我最近阅读了Chris Love's advice on using WCF Tracing to help with troubleshooting 他通过在app.config文件中添加新的XML部分来启用跟踪,此后我看到了similar recommendations here for the same technique

但是,我们并不想发送多个app.config文件 我们绝对不希望客户在生产系统上修改它们!

是否可以在app.config中设置WCF跟踪的各种设置,但是从代码打开/关闭跟踪?

理想情况下,我希望我的应用程序检查注册表,并仅在存在特定值时激活跟踪。

3 个答案:

答案 0 :(得分:11)

我的建议是使用自定义TraceFilter,它应用于附加到WCF TraceSources的所有侦听器(即“System.ServiceModel”,“System.ServiceModel.MessageLogging”)。在TraceFilter的ShouldTrace()方法中,您可以根据应用程序可用的任何信息有条件地禁止跟踪。

以下是一些示例代码,您可以将其作为起点。有一个静态帮助器类,它在应用程序的生命周期内全局和一次确定是应该启用还是禁用跟踪:

namespace WCF.Diagnostics
{
    using System.Diagnostics;

    public static class WcfDiagnosticsHelper
    {
        private readonly static bool _shouldTraceWcf;

        static WcfDiagnosticsHelper()
        {
            // here, determine if WCF Tracing should be enabled or not
            // i.e., read some custom settings from App.config or the registry etc...

            _shouldTraceWcf = true;
        }

        internal static bool ShouldTraceWcf
        {
            get { return _shouldTraceWcf; }
        }
    }

    public class WcfTraceFilter : TraceFilter
    {
        public override bool ShouldTrace(TraceEventCache cache, string source, TraceEventType eventType, int id, string formatOrMessage, object[] args, object data1, object[] data)
        {
            // In here, check the static 'ShouldTraceWcf' property as well as the name of the originating TraceSource
            if (source != null && source.StartsWith("System.ServiceModel") && !WcfDiagnosticsHelper.ShouldTraceWcf)
                return false;
            return true;
        }
    }
}

在App.config中,您可以像这样配置TraceFilter:

<system.diagnostics>
  <sources>
    <source name="System.ServiceModel" propagateActivity="true" switchValue="Warning">
      <listeners>
        <add name="LocalXmlFile" initializeData="WcfTracing.svclog" type="System.Diagnostics.XmlWriterTraceListener">
          <filter type="WCF.Diagnostics.WcfTraceFilter, WCF_Custom_TraceFilter"/>
        </add>
      </listeners>
    </source>
  </sources>
</system.diagnostics>

**

请注意,编写自定义Trace Switch可以实现类似的行为。主要区别在于TraceSwitch应用于TraceSource,TraceFilter应用于TraceListener。但是,它会涉及更多。

答案 1 :(得分:2)

这是关于做类似事情的问题的链接。问这个问题的人似乎对WCF跟踪工作有一些程序控制,但不是全部。如果他的工作满意与否,我不会这样做。

WCF tracing in code does not follow MessageLogging settings

也许它会帮助你,也许不会。

答案 2 :(得分:1)

WCF跟踪正在插入已经在.NET中使用很长时间的System.Diagnostics类。有一个API用于在xml中完成的任何事情。例如Create and Initialize Trace Listeners

总体概述滚动到Trace class文档的底部。