C# 在代码中何时需要多个TraceSource?

C# 在代码中何时需要多个TraceSource?,c#,tracesource,C#,Tracesource,如果一个应用程序正在将其所有活动数据写入一个日志文件,那么拥有多个TraceSource是否有任何用处?我只是对代码中需要不止一个TraceSource的用例感到好奇。有关使用TraceSource的良好起点,请参见以下其他问题的答案: 我会说,如果你有一个以上的类,你可能会考虑拥有不止一个跟踪资源。 拥有多个TraceSource的一个优点是,它增加了您可以控制日志的粒度。例如,如果您在每个类中使用不同的TraceSource,那么您可以控制到类级别的日志记录。您可以打开一个(或多个)特定

如果一个应用程序正在将其所有活动数据写入一个日志文件,那么拥有多个TraceSource是否有任何用处?我只是对代码中需要不止一个TraceSource的用例感到好奇。

有关使用TraceSource的良好起点,请参见以下其他问题的答案:

<>我会说,如果你有一个以上的类,你可能会考虑拥有不止一个跟踪资源。

拥有多个TraceSource的一个优点是,它增加了您可以控制日志的粒度。例如,如果您在每个类中使用不同的TraceSource,那么您可以控制到类级别的日志记录。您可以打开一个(或多个)特定类并关闭所有其他类

这是NLog和log4net用户的常见模式。使用这些日志平台初始化类的典型方式如下所示:

public class A
{
  //NLog example
  private static Logger logger = LogManager.GetCurrentClassLogger();

  public F()
  {
    logger.Info("Inside F");
  }
}
public class A
{
  private static TraceSource ts = new TraceSource(System.Reflection.GetCurrentMethod().DeclaringType.ToString();

  public F()
  {
    ts.Information("Inside F");
  }
}
在本例中,类A的记录器是根据类的完全限定名命名的(NLog在GetCurrentClassLogger()中完成了大量工作)

要对TraceSource执行类似操作,您可以执行以下操作:

public class A
{
  //NLog example
  private static Logger logger = LogManager.GetCurrentClassLogger();

  public F()
  {
    logger.Info("Inside F");
  }
}
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");
  }
}
等等

现在,您可以为“读取”打开日志记录,为所有其他功能区域关闭日志记录(或者为“读取”打开详细日志记录,为所有其他功能区域打开不太详细的日志记录)

此外,TraceListeners的一个选项是输出TraceSource名称。因此,在输出中更容易理解日志记录,因为如果选择这样做,您可以相对轻松地找到从特定功能区域(或特定TraceSource)生成的所有日志记录消息

如果您有一个好的命名空间命名约定,您甚至可以考虑基于命名空间层次结构中的某个节点,甚至基于该类所处的程序集,为每个类获取TraceSeCURCE。对于将为您检索该信息的类型,存在.NET调用

由于您正在查看TraceSources,我鼓励您查看codeplex的此项目:

这是一个很好的项目(基于TraceSource),它允许您以与log4net和NLog类似的方式格式化日志输出

我还鼓励您看看这个围绕Castle的TraceSource构建的日志包装器

他们所做的有趣的事情是为TraceSource名称提供了一个层次结构。我在过去也实现过类似的功能。结果很好

我在这个问题上的回答为TraceSource层次结构如何有益提供了思路:

祝你好运