用于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中没有可用的东西。提供此功能的诊断(我特别考虑的是不必在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
以特定级别进行日志记录。在您的代码中,如果您使用完整的类名Class1
或Class2
创建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>