2010-05-08 102 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