1

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

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

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

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

4

2 回答 2

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

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

因此,例如,您可以通过指定“ ”作为名称来配置所有TraceSources来自Namespace1.Namespace1_1某个级别的记录。在您的代码中,如果您创建一个(或者,实际上是创建一个包装的 TraceSource),其类的完整名称为or ,则会在为.Namespace1.Namespace1_1TraceSourceTraceSourceClass1Class2TraceSourceNamespace1.Namespace1_1

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

于 2014-07-29T18:06:35.153 回答
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>
于 2014-07-29T16:25:53.297 回答