C# 在代码中何时需要多个TraceSource?
如果一个应用程序正在将其所有活动数据写入一个日志文件,那么拥有多个TraceSource是否有任何用处?我只是对代码中需要不止一个TraceSource的用例感到好奇。有关使用TraceSource的良好起点,请参见以下其他问题的答案: <>我会说,如果你有一个以上的类,你可能会考虑拥有不止一个跟踪资源。 拥有多个TraceSource的一个优点是,它增加了您可以控制日志的粒度。例如,如果您在每个类中使用不同的TraceSource,那么您可以控制到类级别的日志记录。您可以打开一个(或多个)特定类并关闭所有其他类 这是NLog和log4net用户的常见模式。使用这些日志平台初始化类的典型方式如下所示:C# 在代码中何时需要多个TraceSource?,c#,tracesource,C#,Tracesource,如果一个应用程序正在将其所有活动数据写入一个日志文件,那么拥有多个TraceSource是否有任何用处?我只是对代码中需要不止一个TraceSource的用例感到好奇。有关使用TraceSource的良好起点,请参见以下其他问题的答案: 我会说,如果你有一个以上的类,你可能会考虑拥有不止一个跟踪资源。 拥有多个TraceSource的一个优点是,它增加了您可以控制日志的粒度。例如,如果您在每个类中使用不同的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");
}
}
在本例中,类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层次结构如何有益提供了思路: 祝你好运