假设我有一个如下所示的配置文件: ...
<system.diagnostics>
<sources>
<source name="System.ServiceModel" switchValue="Warning,ActivityTracing" propagateActivity="true">
<listeners>
<add name="ServiceModelTraceListener" />
</listeners>
</source>
<source name="System.ServiceModel.MessageLogging">
<listeners>
<add name="ServiceModelTraceListener" />
</listeners>
</source>
</sources>
<sharedListeners>
<add initializeData="LogServer.svclog" type="System.Diagnostics.XmlWriterTraceListener" name="ServiceModelTraceListener" />
</sharedListeners>
<trace autoflush="true" />
</system.diagnostics>
当使用此配置文件时,调用者对服务执行的每个活动以及发送到服务的每个相应消息都将记录在svclog文件中。到目前为止一切都很好。
如果我将上面列表中的第3行修改为<source name="System.ServiceModel" switchValue="Warning" propagateActivity="true">
(ActivityTracing
已删除),则仅记录那些至少标记为级别警告的活动。但它仍然记录了每条消息......
那么有没有办法只记录与那些至少是警告的活动相对应的那些消息?那些成功的消息在那一刻并不是很有趣,但那些属于不成功活动的消息是!
答案 0 :(得分:1)
修改强> 要过滤以下选项之外的消息,您可能需要考虑编写自己的TraceSource。
以下是我用于项目的一个。您可以轻松地对其进行自定义以过滤掉您想要的消息,或者如果它不在DEBUG中,则可能隐藏活动等。
class DB : TraceSource
{
public DB(string name) : base(name)
{
}
public DB(string name, SourceLevels sourceLevels) : base (name, sourceLevels)
{
}
public void Log(object value)
{
WriteLine(value);
}
public void Error(object value)
{
WriteLine(value, TraceEventType.Error);
}
public void Error(RecordingResponseData errorResponse)
{
string errorMessage = "[Error] Code: "+errorResponse.ErrorCode +" Message: "+errorResponse.ErrorMessage;
WriteLine(errorMessage, TraceEventType.Error);
}
public void Warn(object value)
{
WriteLine(value, TraceEventType.Warning);
}
public void WriteLine(object value, TraceEventType type = TraceEventType.Information)
{
TraceEvent(type, 0, value.ToString());
}
}
<强>原始强>
您的选择是:
或者那里的组合。如果您将其设置为警告但仍然收到过多消息,那么您可能需要尝试错误或严重。
参考:https://msdn.microsoft.com/en-us/library/ms733025%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396
答案 1 :(得分:0)
switchValue
跟踪开关也有System.ServiceModel.MessageLogging
可用。只需将该属性添加到该source
元素并将其设置为Warning
,您只会看到记录的与警告相关的消息。
答案 2 :(得分:0)
摆脱System.ServiceModel.MessageLogging源以摆脱日志消息以解决“仍记录每条消息”。