我想在我的应用程序中配置一个FileTraceListeners,它忽略'详细'级别的消息,但记录'信息'级别及以上以及'开始'和'停止'事件。
所有内容都在app.config文件中配置。 但是,我找不到用于组合这些不同跟踪级别的正确语法。 The Syntax for filters is explained here。
对“信息”使用单个过滤器将正确过滤掉所有不是“信息”,“警告”,“错误”或“严重”的内容。但是我也想要包括'开始'和'停止'事件。
我尝试使用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或其他框架。)
答案 0 :(得分:1)
我没有尝试使用<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,
"\r\n=============\r\n{0}\r\n==============\r\n", 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);
答案 1 :(得分:1)
我的代码如下:
<filter type="System.Diagnostics.EventTypeFilter" initializeData="Warning,ActivityTracing"/>
及其作品。
答案 2 :(得分:0)
这里说它们可以按位组合:MSDN。
您是否尝试过initializeData="Information|ActivityTracing"
?
答案 3 :(得分:0)
我有同样的问题。我最终尝试将十进制值放入我想要的TraceEventType值的按位组合。有效。在我的情况下,我希望关键,错误,信息和警告去一个听众。我将值设置为1 | 2 | 8 | 4 = 15.我有另一个听众,我只想要Verbose,所以我将值设置为16.然后将源的开关设置为16 | 15 = 31。
示例(摘录):
<filter type="System.Diagnostics.TextWriterTraceListener" initializeData="15"/>
<switches>
<add name="sourceSwitch" value="31"/>
</switches>
谢谢, 尼克