在WCF中记录错误的最佳方法

时间:2009-12-18 12:36:22

标签: c# .net wcf logging

在开发WCF服务层时捕获和记录错误的最佳方法是什么?为什么?

我可以想到三种方式,

1)手动尝试/捕捉每种方法。

2)将责任留给WCF引擎。

3)使用第三方库,例如企业库策略注入/记录。

5 个答案:

答案 0 :(得分:23)

我会实现自定义IErrorHandler并使用log4net

[AttributeUsage (AttributeTargets.Interface)]
public class ErrorPolicyBehaviorAttribute : Attribute, IContractBehavior, IErrorHandler
    {
    private ILog m_logger;

    #region IErrorHandler

    public void ProvideFault (Exception error, MessageVersion version, ref Message fault)
        {
        return;
        }

    public bool HandleError (Exception error)
        {
        m_logger.Error (error.Message, error);
        return true;
        }

    #endregion

    #region IContractBehavior

    public void ApplyDispatchBehavior (ContractDescription contractDescription, ServiceEndpoint endpoint, DispatchRuntime dispatchRuntime)
        {
        ...init logger
        ......Add this class to a list of dispatchRuntime.ChannelDispatcher.ErrorHandlers...
        }

    #endregion
    }

此类还实现了IContractBehavior,因此您可以在服务合同中将其用作属性。

[ErrorPolicyBehavior]
public interface IYourServiceContract
{ }

log4net非常灵活,因此您可以根据需要记录所需内容。

答案 1 :(得分:10)

可以将WCF配置为跨应用程序的所有组件输出流程里程碑的跟踪,例如操作调用,代码异常,警告和其他重要的处理事件。

以下是启用跟踪的app.config示例。

<configuration>
  <system.diagnostics>
    <sources>
      <source name="System.ServiceModel" switchValue="Warning" propagateActivity="true" >
        <listeners>
          <add name="xml"/>
        </listeners>
      </source>

      <source name="myUserTraceSource" switchValue="Warning, ActivityTracing">
        <listeners>
          <add name="xml"/>
        </listeners>
      </source>
    </sources>

    <sharedListeners>
      <add name="xml" 
           type="System.Diagnostics.XmlWriterTraceListener" 
           initializeData="TraceLog.svclog" />
    </sharedListeners>

  </system.diagnostics>
</configuration>

您可以从MSDN: Configuring Tracing了解有关WCF跟踪的更多信息。

Microsoft提供Service Trace Viewer Tool来读取.svclog文件。

除了跟踪之外,您可能还需要考虑使用log4net进行应用内日志记录。

答案 2 :(得分:2)

查看log4net可能值得您花些时间。这里有一个很好的教程CodeProject

答案 3 :(得分:2)

如果您要求记录框架ELMAH也是一个很好的选择。如果您不想在每个方法的try / catch周围乱丢代码,可以尝试使用AOP frameworks,这样您就可以通过使用Attributes标记方法来处理异常

答案 4 :(得分:1)

我会选择数字1.主要是因为减少了3号和2号的开销应该是禁止的。

当然,你仍然想要记录像文件或事件管理器这样的东西。但我个人会使用log4net,因为它比所有entlib的东西都要轻一点。