用于System.Diagnostics的基于类的跟踪源

本文关键字:跟踪 于类 Diagnostics 用于 System | 更新日期: 2023-09-27 18:15:19

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

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

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

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

用于System.Diagnostics的基于类的跟踪源

我认为System中没有可用的东西。提供此功能的诊断(我特别考虑的是不必在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以特定级别进行日志记录。在您的代码中,如果您使用完整的类名Class1Class2创建TraceSource(或者,实际上,创建一个包装的TraceSource),那么TraceSource将在为Namespace1.Namespace1_1配置的级别上进行日志记录。

试着看看Castle的TraceLogger实现,看看你是否可以为你做一些类似的工作。

下面是一个示例。您可以设置共享侦听器。因此,给定的侦听器只需要配置一次。(您仍然需要一遍又一遍地将侦听器映射到源)

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

在你的问题中,你使用了"过滤器"这个词,它大致对应于一个开关值。系统中存在过滤器。诊断跟踪,但它们是根据各种标准减少侦听器响应的事物数量的对象,而不仅仅是开关值。

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