我想在我的应用程序中配置一个FileTraceListeners,它忽略"详细"级别的消息,但记录"信息"级别及以上以及"启动"one_answers"停止"事件。
所有内容都在app.config文件中配置。但是,我找不到用于组合这些不同跟踪级别的正确语法。这里解释过滤器的语法。
对"信息"使用单个筛选器将正确地筛选出所有非"信息"、"警告"、"错误"或"关键"的内容。然而,我也想包括"开始"one_answers"停止"事件。
我尝试使用2个过滤器:
<filter type="System.Diagnostics.EventTypeFilter" initializeData="Information"/>
<filter type="System.Diagnostics.EventTypeFilter" initializeData="ActivityTracing"/>
我尝试组合initializeDate
带逗号:initializeData="Information,ActivityTracing"
或分号initializeData="Information;ActivityTracing"
一切都会导致语法错误。
如何在app.config中组合这两个筛选器?
(我使用的是原生的.net 3.5日志库,目前不希望更改为log4net或其他框架。)
我的代码看起来像:
<filter type="System.Diagnostics.EventTypeFilter" initializeData="Warning,ActivityTracing"/>
及其作品。
我没有尝试使用<filter>
,但最近设置了类似的内容,并通过使用<switches>
和<sources>
元素获得了成功。我是这样做的:
<system.diagnostics>
<trace autoflush="true" indentsize="2" />
<sources>
<source name="SyncService" switchName="infoactivity">
<listeners>
<clear />
<add name="file" />
</listeners>
</source>
</sources>
<switches>
<add name="none" value="Off" />
<add name="infoactivity" value="Information, ActivityTracing" />
<...>
</switches>
<sharedListeners>
<add name="file" type="System.Diagnostics.TextWriterTraceListener"
initializeData="sync.log" />
</sharedListeners>
</system.diagnostics>
只需将switchName
值更改为已定义的开关之一,即可获得适当级别的日志记录。
该代码使用了一个LogEvent智能枚举类中的静态TraceSource(我想我曾经在Jon Skeet的一个答案中找到过一个例子)。
public class LogEvent {
public static readonly LogEvent SyncStart = new LogEvent(1,
"Sync Service started on {0}", TraceEventType.Start);
public static readonly LogEvent SyncStop = new LogEvent(99,
"Sync Service stopped on {0}", TraceEventType.Stop);
public static readonly LogEvent SyncError = new LogEvent(501,
"rn=============rn{0}rn==============rn", TraceEventType.Error);
// etc
private readonly int id;
private readonly string format;
private readonly TraceEventType type;
private static readonly TraceSource trace = new TraceSource("SyncService");
private LogEvent(int id, string format, TraceEventType type)
{
this.id = id;
this.format = format;
this.type = type;
}
public void Log(params object[] data)
{
var message = String.Format(format, data);
trace.TraceEvent(type, id, message);
}
}
在服务代码中,我大量添加了日志记录语句
LogEvent.SyncStart.Log(DateTime.Now);
LogEvent.SyncError.Log("What the??? -- " + e.Message);
LogEvent.SyncStop.Log(DateTime.Now);
这里说它们可以按位组合:MSDN。
你试过initializeData="Information|ActivityTracing"
吗?
我也有同样的问题。我最终尝试只输入我想要的TraceEventType值的按位组合的十进制值。它奏效了。在我的案例中,我希望Critical、Error、Information和Warn都指向一个监听器。我将值设置为1|2|8|4=15。我有另一个监听器,我只想Verbose去,所以我把值设置为16。然后,我将源的开关设置为16|15=31。
示例(片段):
<filter type="System.Diagnostics.TextWriterTraceListener" initializeData="15"/>
<switches>
<add name="sourceSwitch" value="31"/>
</switches>
谢谢,Nick