首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >System.Diagnostics跟踪源名称的通配符

System.Diagnostics跟踪源名称的通配符
EN

Stack Overflow用户
提问于 2013-03-22 01:25:45
回答 1查看 1.6K关注 0票数 6

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

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

代码语言:javascript
复制
<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>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-30 03:50:01

我不知道有什么内置的方法可以自动做到这一点。但是,如果您查看Castle的git存储库中的TraceLogger,就会发现它们本质上包装并扩展了TraceSource,以支持"hierarichal“命名。

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

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

我可以解释在类中提出的想法如何为您工作(而您不必使用Castle)

本质上,在您的客户端代码中(希望记录内容),您将创建一个“记录器”的实例(而不是TraceSource)。例如,作为记录器的输入,您可以给出完全限定的类名。在构造函数内部,使用输入名称来尝试解析TraceSource。如果有配置了该名称的TraceSource,请使用该TraceSource执行此工作。如果不是,请修剪完全限定名称的最右侧部分。尝试解析具有该名称的TraceSource。如果有配置了该名称的TraceSource,请使用该名称。诸若此类。如果你没有找到任何TraceSources,那么不要从你的“记录器”中记录任何东西。您可以添加识别已使用通配符名称("")配置的TraceSource的功能。如果您从未找到使用名称修剪技术的TraceSource,并且如果有"“TraceSource,请使用"*”TraceSource作为备用方法。

所以,你可能会有这样的东西:

代码语言:javascript
复制
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中指定记录器的方式。

祝好运!

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15554156

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档