繁体   English   中英

.net 诊断最佳实践?

[英].net Diagnostics best practices?

我们最初没有使用任何日志记录或调试跟踪,但在花了几个星期来跟踪一些数据损坏后,我们决定将所需的 Debug.Write 和 Trace 用于生产和 Debug.Assert

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

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 查看器,那么您一定要大饱眼福了! :D

强烈建议您考虑在所有应用程序最重要功能的开始和结束时引发启动和停止事件,以便您可以将这些事件与其他遥测数据重叠,以便您可以看到,例如,您的应用程序功能的影响在磁盘、网络、内存、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(可能是 3.5,肯定是 4.0)开始就有一个可用的 ETWTraceListener。 但是这种特殊的 ETW 功能仅在 Vista 和更高版本的操作系统上可用。

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

如果您想花一点时间来包装对 TraceSources 的访问,请参阅此处了解 TraceSource 包装器的有趣实现,它本质上使 TraceSources 能够从“祖先”TraceSources 中“继承”日志记录配置(例如 log4net 和 NLog 记录器可以继承日志记录设置)。

除了第一个参数硬编码为trueAssert之外,您使用它很好。 您可能应该在那里添加一些条件,并且仅当条件为假时才会打印消息(第二个参数)。 因此,在您的代码示例中,它将永远不会显示。 在某些情况下,如果您不想将调试语句包装在条件块中, WriteLineIf可能会派上用场。

查看Debug 类参考,它有很多有用的方法和属性来帮助您记录事情。

System.Diagnostics 还包含 EventLog.WriteEntry,但您可能希望也可能不希望使用跟踪消息淹没 EventLog,尽管这是一种记录主要应用程序事件的简单方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM