2013-03-21 54 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