【问题标题】:Class based trace sources for System.DiagnosticsSystem.Diagnostics 的基于类的跟踪源
【发布时间】:2014-09-20 21:24:42
【问题描述】:

我目前正在从作为日志框架的 log4net 迁移到 System.Diagnostics 命名空间,以便使用 1) 已经可用的 .net 内置框架和 b) 使用它的强大功能,例如活动追踪。

使用 log4net,我习惯于以基于类的方式请求记录器,例如

private readonly ILog Logger = LogManager.GetLogger(typeof(MyClass).Name);

但是对于TraceSource,您似乎必须在 app.config 中手动配置每个跟踪源才能使用它。没有办法创建一些共享侦听器并仅使用它们,并使用TraceEventType 等的“全局过滤器”(例如EventLogListener 处理警告/错误,当设置属性“XY”时,控制台侦听器是活动,否则记录到文件等)

【问题讨论】:

    标签: c# logging log4net system.diagnostics tracesource


    【解决方案1】:

    我认为 System.Diagnostics 中没有任何东西可以提供这种开箱即用的功能(我特别考虑的是不必在 app.config 文件中显式配置每个单独的 TraceSource 的能力)。但是,如果您不介意编写一点代码,您可以编写自己的包装器来提供“分层 TraceSource”功能。看看 Castle 在他们的 TraceLogger 中做了什么:

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

    假设您有以下类(和相关的命名空间):

    Namespace1.Namespace1_1.Class1
    Namespace1.Namespace1_1.Class2
    Namespace1.Namespace1_2.Class3
    Namespace2.Namespace2_1.Class4
    Namespace2.Namespace2_2.Class5
    

    Castle 的实现将允许您使用完整的类名或使用类名的子集(从命名空间末尾开始)配置TraceSource(在您的 app.config 中)。

    因此,例如,您可以通过将“Namespace1.Namespace1_1”指定为TraceSource 名称来进行配置,以使来自Namespace1.Namespace1_1 的所有TraceSources 都记录在某个级别。在您的代码中,如果您创建一个具有完整类名Class1Class2TraceSource(或者实际上是创建一个包装的TraceSource),那么TraceSource 将在为Namespace1.Namespace1_1 配置的级别记录。

    尝试查看 Castle 的 TraceLogger 实现,看看您是否可以让类似的东西为您工作。

    【讨论】:

      【解决方案2】:

      这是一个示例。您可以设置共享侦听器。所以一个给定的监听器只需要配置一次。 (您仍然必须一遍又一遍地将侦听器映射到源)

      来源可以使用命名开关,并且这些开关应该是可共享的(即两个来源使用同一个开关)。

      在您的问题中,您使用了大致对应于开关值的“过滤器”一词。过滤器也存在于 Systems.Diagnostics 跟踪中,但它们是根据各种条件(而不仅仅是开关值)减少侦听器响应的事物数量的对象。

       <system.diagnostics>
            <switches>
                <add name="IdentityStuff" value="Verbose"/>
                <add name="OtherStuff" value="Verbose"/>
            </switches>
          <sources>
            <source name="Microsoft.IdentityModel" switchName="IdentityStuff" >
              <listeners>
                <add name="xml"/>
              </listeners>
            </source>
            <source name="SomeOtherSource" switchName="IdentityStuff" >
              <listeners>
                <add name="xml"/>
              </listeners>
            </source>
          </sources>
            <sharedListeners>
                <add name="xml" type="System.Diagnostics.XmlWriterTraceListener" initializeData="WIFTrace.e2e" />
            </sharedListeners>
        </system.diagnostics>
      

      【讨论】:

        猜你喜欢
        • 2013-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-17
        • 1970-01-01
        • 1970-01-01
        • 2011-04-26
        相关资源
        最近更新 更多