WCF中的日志记录错误 - 抛出异常时,没有任何内容存储在日志文件中

时间:2012-03-05 15:45:29

标签: wcf exception error-handling

我一直在尝试捕获WCF服务中的异常并将它们存储在日志文件中(我不希望客户端此时获得任何特定的错误消息)。

在线阅读了一些教程后,我在web.config的<system.diagnostics>部分添加了一些日志配置:

<sources>
  <source name="System.ServiceModel.MessageLogging" switchValue="Error">
    <listeners>
      <add type="System.Diagnostics.DefaultTraceListener" name="Default">
        <filter type="" />
      </add>
      <add name="ServiceModelMessageLoggingListener">
        <filter type="" />
      </add>
    </listeners>
  </source>
  <source name="System.ServiceModel" switchValue="Error" propagateActivity="true">
    <listeners>
      <add type="System.Diagnostics.DefaultTraceListener" name="Default">
        <filter type="" />
      </add>
      <add name="ServiceModelTraceListener">
        <filter type="" />
      </add>
    </listeners>
  </source>
</sources>    
<sharedListeners>
  <add initializeData="C:\inetpub\wwwroot\myApp\logs\Web_messages.svclog" type="System.Diagnostics.XmlWriterTraceListener, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="ServiceModelMessageLoggingListener" traceOutputOptions="Timestamp">
    <filter type="" />
  </add>
  <add initializeData="C:\inetpub\wwwroot\myApp\logs\Web_tracelog.svclog" type="System.Diagnostics.XmlWriterTraceListener, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="ServiceModelTraceListener" traceOutputOptions="Timestamp">
    <filter type="" />
  </add>
</sharedListeners>

如果发生异常,我已尝试使用Debug.WriteLine和Trace.WriteLine,但没有任何内容被写入跟踪文件。

我知道IIS / WCF可以写入日志文件,如果我将其中任何一个源的switchValue设置为Verbose我会获得大量信息(太多无法使用),但我只想要异常代码。

1 个答案:

答案 0 :(得分:1)

试试这个, 考虑以下课程

public class TraceUtility 
{
    private TraceSource trcSrc;

    public TraceUtility(string traceSourceName)
    {
        if (string.IsNullOrEmpty(traceSourceName))
        {
            throw new ArgumentNullException(traceSourceName);
        }

        trcSrc = new TraceSource(traceSourceName);
    }

    public void TraceError(int id, string message)
    {
        trcSrc.TraceEvent(TraceEventType.Error, id, message);
    }

    public void TraceError(int id, string message, params object[] args)
    {
        trcSrc.TraceEvent(TraceEventType.Error, id, message, args);
    }

    public void TraceError(string message)
    {
        TraceError(0, message);
    }

    public void TraceError(string message, params object[] args)
    {
        TraceError(0, message, args);
    }

}

现在将以下配置部分添加到配置文件

<system.diagnostics>
    <sources>
        <source name="xyz" switchName="AllSwitch">
            <listeners>
                <add name="xyzListener"  type="System.Diagnostics.TextWriterTraceListener" initializeData="C:\Traces\xyz.txt" traceOutputOptions="DateTime" />
            </listeners>
        </source>
    </sources>
    <switches>
        <add name="AllSwitch" value="All"/>
        <add name="OnlyErrors" value="Error"/>
    </switches>
    <trace autoflush="true" indentsize="3"/>
</system.diagnostics>

最后,为了使用它:

TraceUtilitiy trcSrc = new TraceUtility("xyz");

trcSrc.TraceError("Error: {0}", "Your error description");

请注意,您可以像跟踪错误方法一样,为跟踪实用程序类添加信息和警告的跟踪方法。

希望这是你正在寻找的。

修改 您的其他代码未运行,因为您没有为System.Diagnostics.Trace类指定自定义侦听器。为此,请在配置中添加以下部分:

  <system.diagnostics>
    <trace autoflush="true" indentsize="4">
      <listeners>
        <remove name="DefaultTraceListener" />

        <add name="LogFileListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="C:\Traces\xyz1.txt" />
      </listeners>
    </trace>
  </system.diagnostics>

并尝试使用旧代码。希望这会让你感到困惑;)