gpt4 book ai didi

c# - 什么时候代码中需要多个 TraceSource?

转载 作者:太空狗 更新时间:2023-10-29 22:34:32 25 4
gpt4 key购买 nike

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

最佳答案

有关使用 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");
}
}

如果你在每节课都这样做,你可以很容易地控制你按类(class)记录。

我不太确定这种模式在 TraceSource 中是否像在 log4net 和 NLog 中一样常见。我认为您可能更经常看到 TraceSource 的用户按功能区域获取他们的 TraceSources。

因此,您可以将您的应用划分为“读取”、“处理”和“写入”功能(或任何对您有意义的功能)。在这种情况下,您可以根据使用它们的功能区域在您的类中获得适当的 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)生成的所有日志消息。

如果您有良好的命名空间命名约定,您甚至可以考虑基于命名空间层次结构中的某个节点或什至基于该类所在的程序集为每个类获取 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 层次结构如何有益的想法:

What's the best approach to logging?

祝你好运!

关于c# - 什么时候代码中需要多个 TraceSource?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4867947/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com