2

我想在我的应用程序中配置一个 FileTraceListeners,它会忽略“详细”级别的消息,但会记录“信息”级别及更高级别以及“开始”和“停止”事件。

一切都在 app.config 文件中配置。但是,我找不到组合这些不同跟踪级别的正确语法。 这里解释了过滤器的语法

对“信息”使用单个过滤器将正确过滤掉所有非“信息”、“警告”、“错误”或“关键”的内容。但是我也想包括“开始”和“停止”事件。

我尝试使用 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

4 回答 4

2

我的代码如下所示:

<filter type="System.Diagnostics.EventTypeFilter"   initializeData="Warning,ActivityTracing"/> 

及其作品。

于 2015-11-25T09:17:32.960 回答
1

我没有尝试使用,<filter>但最近设置了类似的东西,并且通过使用<switches>and<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);
于 2013-08-15T15:58:02.053 回答
0

它在这里说它们可以按位组合:MSDN

你试过initializeData="Information|ActivityTracing"吗?

于 2012-07-10T12:41:45.010 回答
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>

谢谢,尼克

于 2015-07-08T16:06:48.843 回答