16

最初はログ記録やデバッグ トレースを使用しませんでしたが、データの破損を追跡するために数週間費やした後、必要な 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");
}

これは一般的な目的には十分ですが、私はそこで何か間違ったことをしていますか?

log4net などの他の代替手段よりも、.net System.Diagnostics に固執したいと考えています。

System.Diagnostics で他に役立つものはありますか?

4

4 に答える 4

13

アプリ全体で ETW トレース イベントを発生させることを計画する必要があります。リスナーに問題を警告するだけでなく、アプリやコンポーネントのパフォーマンスの動作やパフォーマンスを可視化することもできます。

ETW は、(非常に) 高性能で (驚くほど) 影響が少なく、運用環境でも収集および分析できるイベントを発生させる方法です。これは、Windows、SQL などで使用されるログとトレースのインフラストラクチャです。

3 つの便利なリンク:

  1. 診断: .NET 3.5 (EventProviderTraceListener) での ETW トレースの使用
  2. .NET Framework ログのリンク テキストの制御
  3. 2 分間の演習: XPerf の概要

3 つすべてを順番に読んでから、もう一度読み直してください。後の情報は非常に役立ちますが、最初に基本を把握しないと理解するのが難しくなります ;) logman を使用してトレース収集を開始および停止する手順は無視してください。代わりに XPerf を使用してください。

Perf ツールキットと XPerf ビューアーをまだご覧になっていない方は、ぜひご賞味ください。:D

アプリの最も重要なすべての機能の開始時と終了時に開始イベントと停止イベントを発生させることを検討することを強くお勧めします。これにより、これらのイベントを他のテレメトリと重ね合わせて、たとえばアプリ機能の影響を確認できるようになります。ディスク、ネットワーク、メモリ、CPU など

お役に立てれば。

于 2010-05-25T23:49:43.377 に答える
5

この応答は遅いですが...

Debug.WriteLineやTrace.WriteLineではなくTraceSourcesの使用を検討する必要があると思います。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を使用すると、.NET以降(おそらく3.5、確かに4.0まで)に利用可能なETWTraceListenerがあるため、将来ETWを使用するのに適した位置になります。ただし、この特定のETW機能は、Vista以降のOSでのみ使用できます。

System.Diagnosticsに機能を追加するには(主に、TraceSourceを介してログを記録する場合のみ)、Ukadc.Diagnosticsを参照してください。Ukadc.Diagnosticsは、System.Diagnosticsに非常に優れたフォーマット機能(log4netおよびNLogで実行できる機能と同様)を追加します。コードの依存関係はありません(Ukadc.Diagnosticsをインストールし、app.configに構成を追加するだけです)。本当にかっこいいと思います。

TraceSourcesへのアクセスをラップするために少し作業を加えたい場合は、TraceSourcesに「祖先」TraceSourcesからロギング構成を「継承」する機能(log4netやNLogロガーなど)を本質的に提供するTraceSourceラッパーの興味深い実装についてはこちらをご覧ください。ロギング設定を継承できます)。

于 2010-10-03T14:59:21.600 に答える
0

Assertにハードコードされた最初の引数を除いて、問題なく使用していますtrue。そこに何らかの条件を追加すると、条件が false の場合にのみメッセージ (2 番目の引数) が出力されます。したがって、コード例では表示されません。WriteLineIfデバッグ ステートメントを条件付きブロックでラップしたくない場合に便利な場合があります。

デバッグ クラス リファレンスを確認してください。これには、ログ記録に役立つ便利なメソッドとプロパティが多数含まれています。

于 2010-05-08T19:29:23.023 に答える
0

System.Diagnostics には EventLog.WriteEntry も含まれていますが、主要なアプリ イベントをログに記録する簡単な方法ですが、EventLog にトレース メッセージを大量に送りたい場合とそうでない場合があります。

于 2010-05-25T23:59:29.900 に答える