【问题标题】:System.Diagnostics Traces wildcard for source nameSystem.Diagnostics 跟踪源名称的通配符
【发布时间】:2013-03-11 08:30:03
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# .net system.diagnostics


    【解决方案1】:

    我不知道自动执行此操作的内置方法。但是,如果您查看 Castle 的 git 存储库中的 TraceLogger,您会发现它们本质上已经包装和扩展了 TraceSource 以支持“分层”命名。

    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 作为备用。

    所以,你可能有这样的事情:

    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 中指定记录器的方式。

    祝你好运!

    【讨论】:

    • 感谢这个答案太棒了。我已经按照你的建议做了几乎一样的事情。我为记录器提供了完整的类名并尝试解析程序集。然后我使用程序集名称作为日志源。 (所以我为我所有的程序集设置了不同的来源)。但我从没想过制作自己的通配符源。另外,我认为您的解决方式具有更大的灵活性,并且可能更快。谢谢,实现这个对我来说并不难,非常有用!
    猜你喜欢
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    • 1970-01-01
    • 2021-08-25
    • 2021-11-08
    相关资源
    最近更新 更多