我一直在尝试捕获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我会获得大量信息(太多无法使用),但我只想要异常代码。
答案 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");
请注意,您可以像跟踪错误方法一样,为跟踪实用程序类添加信息和警告的跟踪方法。
希望这是你正在寻找的。 p>
修改强> 您的其他代码未运行,因为您没有为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>
并尝试使用旧代码。希望这会让你感到困惑;)