2013-03-21 51 views
5

我有我的Logging設置爲使用不同的TraceSource爲每個ClassSystem.Diagnostics源名稱的跟蹤通配符

是否可以配置爲所有源編寫事件的通配符?

<system.diagnostics> 
    <sources> 
    <source name ="wildcard" switchValue="Warning"> 
     <listeners> 
     <add name="textlog" /> 
     </listeners> 
    </source> 
    <source name="MySpecificClass" switchValue="All"> 
     <listeners> 
     <add name="textlog" /> 
     </listeners> 
    </source> 
    </sources> 
    <sharedListeners> 
    <add name="textlog" 
     type="System.Diagnostics.TextWriterTraceListener" 
     initializeData="Log.log"> 
    </add> 
    </sharedListeners> 
    <trace autoflush="true"/> 
</system.diagnostics> 

回答

4

我不知道內置的方式自動執行此操作。但是,如果您查看Castle的git存儲庫中的TraceLogger,則可以看到它們已經基本上包裝並擴展了TraceSource以支持「hierarichal」命名。

https://github.com/castleproject/Core/blob/master/src/Castle.Core/Core/Logging/TraceLogger.cs

我會在這裏複製的代碼,但它可能不是正確的,只是削減和有代碼粘貼到SO。

我可以解釋如何在課堂上提出的意見可能對你的工作(沒有你不必使用城堡)

從本質上說,在你的客戶端代碼(即要登錄的東西),你會創建一個實例你的「記錄器」(而不是TraceSource)。作爲記錄器的輸入,例如,您可以提供完全限定的類名稱。在構造函數內部,使用輸入名稱來嘗試解析TraceSource。如果有一個使用該名稱配置的TraceSource,請使用該TraceSource來完成這項工作。如果不是,請刪除完全限定名稱的最右側部分。嘗試使用該名稱解析TraceSource。如果使用該名稱配置了TraceSource,請使用它。等等。如果您沒有找到任何TraceSources,則不要記錄您的「記錄器」中的任何內容。您可以添加識別已使用通配符名稱(「」)配置的TraceSource的功能。如果您從未使用名稱裁剪技術找到TraceSource,並且如果存在「」TraceSource,則使用「*」TraceSource作爲後備。

所以,你可能有這樣的事情:

class MyTraceSource 
{ 
    private TraceSource ts; 

    public MyTraceSource(string name) 
    { 
    ResolveTraceSource(name); 
    } 

    private void ResolveTraceSource(string name) 
    { 
    //Check for a configured TraceSource from most qualified name (as input) to least qualified (""). 
    //Assume name like this: Namespace1:Namespace2:Class 
    //Try to resolve: 
    // TraceSource("Namespace1.Namespace2.Class"); 
    // TraceSource("Namespace1.Namespace2"); 
    // TraceSource("Namespace1"); 
    //If you still haven't found one, try to resolve 
    // TraceSource("*"); 
    } 

    //Implement either TraceSource API, or whatever API you prefer for logging. 

} 

其實我已經做了這樣的事情我自己爲原型的部分(即我們結束了不使用)和它的工作相當不錯模仿的方式您可以在log4net和NLog中指定記錄器。

祝你好運!

+0

謝謝你的回答太棒了。我已經做了幾乎像你所建議的一樣。我給記錄員完整的課程名稱,並試圖解決大會。然後我使用程序集名稱作爲日誌源。 (所以我的所有裝配都有不同的來源)。但我從來沒有想過要製作自己的通配符來源。此外,我認爲你的解決方式有更多的靈活性,並且可能更快。感謝它不會讓我很難實現這一點,非常有用! – 2013-03-30 11:14:36