.net诊断最佳实践是什么?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (15)

我们最初没有使用任何日志记录或调试跟踪,但花了几周的时间来追踪一些数据损坏后,我们决定将必需的Debug.Write和Trace用于生产和调试。

所以现在问题是什么是使用调试和跟踪日志的最佳做法。我只是寻找一些通用的东西。

public void AddRectodatabase(object record)
{
   Debug.WriteLine(record.ToString());
   Trace.WriteLine(record.ToString());

   // Add it to databse

   Debug.Assert(true, "Use this on case by case basis");
}

这是否足够用于一般用途,我在那里做错了什么?

我们希望坚持使用.net System.Diagnostics,而不是像log4net这样的其他选择。

在System.Diagnostics中还有其他用处吗?

提问于
用户回答回答于

应该计划在整个应用程序中引发ETW跟踪事件 - 不仅要提醒听众问题,还要提供应用程序和组件性能的行为甚至性能的可见性。

ETW是一种(疯狂)高性能和(令人惊讶的)低影响力的方式,即使在生产环境中也可以收集和分析事件。这是Windows,SQL等使用的日志记录和跟踪基础架构。

三个有用的链接给你:

  1. 诊断:在.NET 3.5中使用ETW跟踪(EventProviderTraceListener)
  2. 控制.NET Framework日志记录链接文本
  3. 两分钟演练:介绍XPerf

按顺序阅读全部3,然后重新阅读 - 稍后的信息将非常有用,但除非首先掌握基本知识,否则将更难理解忽略使用logman启动和停止跟踪收集的说明; 改用XPerf。

如果你还没有看到Perf工具包和XPerf查看器,那么你就有机会享受!

强烈建议考虑在所有应用程序的最重要功能的开始和结束时举办开始和停止活动,以便可以使用其他遥测技术覆盖这些活动,以便查看应用程序功能的影响磁盘,网络,内存,CPU等。

用户回答回答于

我认为你应该考虑使用TraceSources而不是Debug.WriteLine和/或Trace.WriteLine。使用TraceSources,可以实现对日志记录的更高级别的控制。每个TraceSource的级别都可以像TraceSource(TraceListener)的目标一样进行控制。你可以编写这样的代码:

public class RectToSqlServer : IDatabaseUtilities
{
  private static readonly TraceSource ts = new TraceSource("RectToSqlServer");

  public void AddRectToDatabase(object record)
  {
    ts.TraceEvent(TraceEventType.Information, "record = {0}", record.ToString());

    //Add record to database ...

  }
}

public class RectToOracle : IDatabaseUtilities
{
  private static readonly TraceSource ts = new TraceSource("RectToOracleServer");

  public void AddRectToDatabase(object record)
  {
    ts.TraceEvent(TraceEventType.Information, "record = {0}", record.ToString());

    //Add record to database ...

  }
}

现在,可以独立控制每个类的日志记录(级别,目标等)。此外,请注意,不必同时添加Trace.WriteLine和Debug.WriteLine以同时在调试版本和发布版本中进行日志记录。使用TraceSources将使您在未来可以使用ETW,因为有一个以.NET开始的ETWTraceListener(可能3.5,当然是4.0)。但是这个特殊的ETW功能仅适用于Vista和更高版本的操作系统。

要为System.Diagnostics添加功能(主要是 - 也许只有 - 如果通过TraceSource进行记录),请查看Ukadc.Diagnostics。Ukadc.Diagnostics将非常酷的格式化功能(类似于可以对log4net和NLog执行的操作)添加到System.Diagnostics中。没有代码依赖性(只需安装Ukadc.Diagnostics并将一些配置添加到您的app.config中)。我不得不说,我认为这真的很酷。

如果希望将一些工作包装到TraceSources的访问中,请参阅此处了解TraceSource包装器的一个有趣实现,它实际上使TraceSources能够从“祖先”TraceSources“继承”日志记录配置(例如log4net和NLog日志记录器可以继承日志记录设置)。

扫码关注云+社区