如果一个应用程序将其所有活动数据写入一个日志文件中,是否有使用多个TraceSource的用途?我只是对代码中需要多个TraceSource的用例感到好奇。
答案 0 :(得分:9)
有关使用TraceSources的良好起点,请参阅其他问题的这些答案:
can't understand .net 2010 tracing and app.config
How to use TraceSource across classes
我想说,只要你有多个课程,你可能会(可能)考虑拥有多个TraceSource。
拥有多个TraceSource的一个优点是它可以增加控制日志记录的粒度。例如,如果在每个类中使用不同的TraceSource,则可以将日志记录控制到类级别。您可以打开一个(或多个)特定类并关闭所有其他类。
这是NLog和log4net用户的常见模式。使用这些日志记录平台的类的典型初始化将如下所示:
public class A
{
//NLog example
private static Logger logger = LogManager.GetCurrentClassLogger();
public F()
{
logger.Info("Inside F");
}
}
在此示例中,类A的记录器以类的完全限定名称命名(NLog在GetCurrentClassLogger()中执行繁重的工作)。
要使用TraceSource执行类似的操作,您可以执行以下操作:
public class A
{
private static TraceSource ts = new TraceSource(System.Reflection.GetCurrentMethod().DeclaringType.ToString();
public F()
{
ts.Information("Inside F");
}
}
如果你在每个班级都这样做,你可以轻松控制你按班级记录。
我不太确定这种模式与TraceSource一样常见,因为它与log4net和NLog一样。我认为您可能更经常看到TraceSource的用户按功能区域获取他们的TraceSource。
因此,您可以将应用程序划分为“读取”,“处理”和“写入”功能(或任何对您有意义的功能)。在这种情况下,您可以根据使用它们的功能区域在类中获取相应的TraceSource:
public class FileReader
{
private static TraceSource ts = new TraceSource("Read");
public F()
{
ts.Information("Hello from FileReader.F");
}
}
public class NetworkReader
{
private static TraceSource ts = new TraceSource("Read");
public F()
{
ts.Information("Hello from NetworkReader.F");
}
}
等等。
现在您可以为“Read”打开登录,关闭所有其他功能区域(或打开“Read”的详细日志记录,为所有其他区域打开更详细的日志记录)。
此外,TraceListeners的一个选项是输出TraceSource名称。因此,在您的输出中,您将更容易理解日志记录,因为如果您选择这样做,您可以相对轻松地找到从特定功能区域(或特定TraceSource)生成的所有日志消息。
如果你有一个好的命名空间命名约定,你甚至可以考虑根据命名空间层次结构中的某个节点或者甚至根据类所在的程序集为每个类获取TraceSource。有一个类型的.NET调用将为您检索该信息。
由于您正在查看TraceSources,我建议您在codeplex查看此项目:
http://ukadcdiagnostics.codeplex.com/
这是一个很好的项目(基于TraceSource),它允许您以与log4net和NLog相似的方式格式化日志记录输出。
我还建议你看看这个围绕Castle的TraceSource构建的日志包装器。
https://github.com/castleproject/Castle.Core/blob/master/src/Castle.Core/Core/Logging/TraceLogger.cs
他们所做的有趣的事情是为TraceSource名称提供层次结构。我过去实现过类似的东西。它运作得很好。
我在这个问题中的答案提供了一个关于TraceSource层次结构如何有益的想法:
祝你好运!