簡體   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