【问题标题】:combine multiple tracesource filters in app.config在 app.config 中组合多个跟踪源过滤器
【发布时间】:2012-07-10 12:13:36
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    我的代码如下:

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

    及其作品。

    【讨论】:

      【解决方案2】:

      我没有尝试使用&lt;filter&gt;,但最近设置了类似的东西,并通过使用&lt;switches&gt;&lt;sources&gt; 元素成功。我是这样做的:

       <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);
      

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 谢谢,这是个好主意。可悲的是,这也会导致 ConfigurationErrorsException:“无法创建 System.Diagnostics.EventTypeFilter”。我认为 initializeData 只是作为字符串传递给构造函数
        • 您是否尝试过使用 2 个监听器?
        • 这可能适用于 ConsoleTraceListeners(不确定),但两个 FileTraceListeners 不能写入同一个文件
        【解决方案4】:

        我也有同样的问题。我最终尝试为我想要的 TraceEventType 值的按位组合输入十进制值。有效。就我而言,我希望将“关键”、“错误”、“信息”和“警告”发送给一位听众。我将值设置为 1 | 2 | 8 | 4 = 15。我有另一个监听器,我只想要 Verbose,所以我将值设置为 16。然后我将源开关设置为 16 | 15 = 31。

        示例(sn-p):

        <filter type="System.Diagnostics.TextWriterTraceListener" initializeData="15"/>
        
        <switches>
            <add name="sourceSwitch" value="31"/>
        </switches>
        

        谢谢, 尼克

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-30
          • 2011-05-07
          • 1970-01-01
          • 2017-10-27
          • 2021-04-24
          • 1970-01-01
          • 2014-08-09
          • 2016-10-14
          相关资源
          最近更新 更多