在app.config中组合多个跟踪源筛选器



我想在我的应用程序中配置一个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

最新更新