2010-05-08 143 views
16

我们最初没有使用任何记录或调试跟踪,但是花费数周跟踪了一些数据损坏后,我们决定把需要Debug.Write和跟踪生产和Debug.Assert的.net诊断最佳实践?

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

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中还有其他有用的东西吗?

回答

13

你应该在提高ETW跟踪事件的整个应用计划 - 不仅提醒听众的问题,而且还能提供可见性的行为,甚至你的应用程序和组件的性能表现。

ETW是(疯狂)的高性能和(惊人的)提高,可以收集和分析事件的影响较小的方式 - 即使是在生产环境中。这是整个的Windows,SQL使用的日志&跟踪的基础设施等,为您

三个有用的链接:

  1. Diagnostics: Using ETW tracing in .NET 3.5 (EventProviderTraceListener)
  2. Controlling .NET Framework Logging link text
  3. Two Minute Drill: Introduction to XPerf

阅读所有3为了然后重新阅读 - 稍后的信息将非常有用,但除非您掌握,否则将更难理解基本知识第一;)忽略使用logman启动和停止跟踪集合的说明;改用XPerf。

如果你还没有看到the Perf toolkit and XPerf viewer,那么你是在一种享受! :d

强烈建议您考虑提高开始在所有的应用程序最重要的特征的开始和结束&停止事件,以便您可以覆盖这些事件与其他遥测,这样你可以看到,对于例如,你的应用程序的影响,磁盘,网络,内存,CPU等

希望这有助于上的功能。

0

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

退房的Debug class reference它有不少有用的方法和属性来帮助您登录的事情。

+0

谢谢RaYell,对于我刚刚提出的不良样品感到抱歉。 – mamu 2010-05-08 19:37:10

0

System.Diagnostics还包含EventLog.WriteEntry,但您可能想也可能不想用跟踪消息泛滥EventLog,尽管它是一种轻松获取主要应用程序事件记录的方法。

5

这种反应较晚,但...

我想你应该考虑使用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您的访问,看到here一个有趣的实施TraceSource包装,基本上给TraceSources从“祖先” TraceSources以“继承”日志记录配置的能力(怎么样log4net和NLog记录器可以继承记录设置)。

+0

+1,但可能想更改'RecToOracle'中的魔法字符串:D – 2011-02-22 20:35:47

+0

@Ruben Bartelink - 好! – wageoghe 2011-02-22 21:03:22