System.Diagnostics跟踪通配符以获取源名称

时间:2013-03-21 17:25:45

标签: c# .net system.diagnostics

我的Logging设置为每个TraceSource使用不同的Class

是否可以配置为所有源写入事件的通配符?

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

1 个答案:

答案 0 :(得分:4)

我不知道有一种内置的方法可以自动完成。但是,如果您查看Castle的git存储库中的TraceLogger,您可以看到它们实际上已经包装并扩展了TraceSource以支持“hierarichal”命名。

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

我会在这里复制代码,但将代码剪切并粘贴到SO中可能不合适。

我可以解释课堂上提出的想法如何适用于你(无需使用Castle)

实质上,在您的客户端代码(想要记录内容)中,您将创建“logger”的实例(而不是TraceSource)。作为记录器的输入,您可以提供完全限定的类名。在构造函数内部,使用输入名称尝试解析TraceSource。如果存在使用该名称配置的TraceSource,请使用该TraceSource执行此操作。如果没有,请修剪完全限定名称的最右边部分。尝试使用该名称解析TraceSource。如果存在使用该名称配置的TraceSource,请使用它。等等。如果找不到任何TraceSource,则不要记录“logger”中的任何内容。您可以添加识别已使用通配符名称(“”)配置的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中指定记录器的方式。

祝你好运!