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

Posted

技术标签:

【中文标题】我可以以编程方式控制 WCF 跟踪吗?【英文标题】:Can I control WCF Tracing programmatically? 【发布时间】:2011-12-09 09:13:59 【问题描述】:

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

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

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

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

【问题讨论】:

***.com/a/34283667/187650 您可以使用 wmi 启用它,请参阅链接。 【参考方案1】:

我的建议是使用自定义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。不过,它会稍微复杂一些。

【讨论】:

优秀的答案。这非常接近我的需要,但由于某种原因,即使我将 _shouldTraceWcf 设置为 false,日志文件似乎仍在增长。 这听起来很奇怪。您能否发布 app.config 的 &lt;system.diagnostics&gt; 部分? &lt;system.diagnostics&gt; 与您描述的一样,但 System.ServiceModel.MessageLogging 的第二个条目写入单独的文件。还有一个&lt;system.serviceModel&gt;&lt;diagnostics&gt;&lt;messageLogging&gt; 部分打开了消息记录。两者都使用相同的TraceFilter - 消息记录功能关闭(文件已创建但保持为 0 字节),但 ServiceModel 仍被填充。 我暂时放弃了这方面的工作,只是让客户/现场工程师尽可能容易地编辑 app.config(使用命名为 &lt;sharedListener&gt; 的条目,所以他们需要做的所有事情取消注释 &lt;listeners&gt; 部分中的 &lt;add name="myListener"&gt; 条目)。我奖励你赏金,因为你让我最接近解决方案。感谢您的帮助。【参考方案2】:

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

WCF tracing in code does not follow MessageLogging settings

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

【讨论】:

【参考方案3】:

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

对于一般概述,滚动到Trace class 文档的底部。

【讨论】:

以上是关于我可以以编程方式控制 WCF 跟踪吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以以编程方式修改选择了哪个 UITableViewCell 吗?

以编程方式创建 WCF REST 客户端代理(在 C# 中)

我应该在新视图中嵌入视图控制器的视图吗?

未以编程方式检测 Dismiss Popover

对于 iOS,我可以混合和匹配以编程方式添加视图并同时使用情节提要吗?

可以100%以编程方式创建,更新和删除(管理)Dialogflow代理吗?