我不知道內置的方式自動執行此操作。但是,如果您查看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中指定記錄器。
祝你好運!
謝謝你的回答太棒了。我已經做了幾乎像你所建議的一樣。我給記錄員完整的課程名稱,並試圖解決大會。然後我使用程序集名稱作爲日誌源。 (所以我的所有裝配都有不同的來源)。但我從來沒有想過要製作自己的通配符來源。此外,我認爲你的解決方式有更多的靈活性,並且可能更快。感謝它不會讓我很難實現這一點,非常有用! – 2013-03-30 11:14:36