2012-07-10 39 views
1

我想在我的應用程序中配置一個FileTraceListeners,忽略'詳細'級別的消息,但是會記錄'信息'級別及以上以及'start'和'stop'事件。在app.config中結合了多個跟蹤源過濾器

所有配置都在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

這裏說,他們可以按位組合:MSDN。您是否試過initializeData="Information|ActivityTracing"

+0

謝謝,這是一個好主意。不幸的是,這也會導致ConfigurationErrorsException:「無法創建System.Diagnostics.EventTypeFilter」。我認爲initializeData只是作爲字符串傳遞給構造函數 – HugoRune 2012-07-10 13:40:23

+0

您是否嘗試過使用2個偵聽器? <添加名稱= 「prueba1」 類型= 「System.Diagnostics.ConsoleTraceListener」> <濾波器類型= 「System.Diagnostics.EventTypeFilter」 initializeData = 「信息」/> <添加名稱= 「prueba2」 類型= 「System.Diagnostics.ConsoleTraceListener」> <濾波器類型= 「System.Diagnostics.EventTypeFilter」 initializeData = 「ActivityTracing」/> smp 2012-07-11 08:40:26

+0

這可以ConsoleTraceListeners工作(不知道),但是兩個FileTraceListeners不能寫入相同的文件 – HugoRune 2012-07-11 14:08:45

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

感謝, 尼克

0

我的代碼如下所示:

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

及其作品。