【问题标题】:How to filter/disable exceptions being logged in WCF trace?如何过滤/禁用 WCF 跟踪中记录的异常?
【发布时间】:2013-01-30 17:00:57
【问题描述】:
  1. 有没有办法防止在 WCF 跟踪中记录某种类型的异常?
  2. 更好的是,有没有办法防止记录一个特定异常(我的意思是在特定代码行引发一个异常)?

说明:

我正在开发两个 Windows 服务 (A) 和 (B)。在服务 (A) 上,我在 app.config 文件中启用了 WCF 跟踪,如下所示:

<system.diagnostics>
    <sources>
        <source name="System.ServiceModel" switchValue="Warning" 
                propagateActivity="true">
            <listeners>
                <add name="traceListener" 
                     type="System.Diagnostics.XmlWriterTraceListener"
                     initializeData="C:\WCF-log.txt" />
            </listeners>
        </source>
    </sources>
</system.diagnostics>

在此服务 (A) 上,我有一些代码用于检测其他服务 (B) 是否已关闭,如下所示:

try {
    serviceB.Ping(); // Exception is thrown here when serviceB is down, and 
                     // logged in the C:\WCF-log.txt file
} catch {
    // Manage failed ping (log...)
}

现在,服务 (B) 有时会出现故障,这很正常。我希望那些引发的异常不要记录在 WCF 跟踪中,因为它们已经被我的应用程序处理过,我只想查看 C:\WCF-log.txt 文件如果有一个“真正的”问题。

【问题讨论】:

  • 是的,您可以编写自定义过滤器,例如msdn.microsoft.com/en-us/library/… 并在过滤器中尝试查找跟踪中的内容(如堆栈跟踪中的值或特定错误)以过滤掉该值。但是我没有时间写一个工作示例。
  • @MatthewMartin 谢谢,Milan 在下面提供了一个代码示例。

标签: c# wcf exception trace


【解决方案1】:

您应该在跟踪侦听器配置中添加过滤器类型,如下所示

<system.diagnostics>
        <sources>
            <source name="System.ServiceModel" switchValue="Warning"
                    propagateActivity="true">
                <listeners >
                    <add name="traceListener"
                         type="System.Diagnostics.XmlWriterTraceListener"
                         initializeData="C:\WCF-log.txt" >
                        <filter type="FilterExceptions"/>
                    </add>                  
                </listeners>
            </source>
        </sources>
    </system.diagnostics>

FilterException 类型应该继承 System.Diagnostics.TraceListener 并覆盖 ShouldFilter 方法,如下所示

 public class FilterExceptions : TraceFilter
    {
        public override bool ShouldTrace(TraceEventCache cache, string source, TraceEventType eventType, int id, string formatOrMessage, object[] args, object data1, object[] data)
        {
            // Add exception filter in below if when event type is error
            if (eventType == TraceEventType.Error)
            {
                return false;
            }

            return true;
        }
    }

【讨论】:

  • 谢谢,这正是我想要的!我只是添加将过滤器编写如下:&lt;filter type="MyAssembly.FilterExceptions, MyAssembly"/&gt;,否则我的代码抛出异常“'System.ServiceModel.Diagnostics.TraceUtility' 的类型初始化程序抛出异常”,其InnerException 是“找不到类 FilterExceptions 的类型”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多