在app.config中组合多个traceource过滤器

时间:2012-07-10 12:13:36

标签: c# logging app-config .net tracesource

我想在我的应用程序中配置一个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或其他框架。)

4 个答案:

答案 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>

谢谢, 尼克