System.Diagnostics的基于类的跟踪源

时间:2014-07-29 13:24:27

标签: c# logging log4net system.diagnostics tracesource

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

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

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

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

2 个答案:

答案 0 :(得分: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中)。

因此,举例来说,您可以通过将“TraceSources”指定为Namespace1.Namespace1_1来配置,以便Namespace1.Namespace1_1来自TraceSource的所有TraceSource。在您的代码中,如果您使用完整的类名Class1Class2创建TraceSource(或实际上创建一个包装的TraceSource),那么Namespace1.Namespace1_1将会记录为{{1}}配置的级别。

尝试查看Castle的TraceLogger实现,看看你是否可以为你做这样的工作。

答案 1 :(得分:0)

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

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

在您的问题中,您使用“过滤器”一词,它大致对应一个开关值。过滤器也存在于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>