4

System.Diagnostics.Trace を拡張する優れたライブラリはありますか?

私が探している機能のいくつか。

  • ローリングログ
  • SMTP

そして、「log4netを使用する」は答えではありません。その理由は、サードパーティのアセンブリへの参照を望まないからです。

コメントへの回答: トレースを使用してもビジネス コードが汚染されないためです。私は Trace.XXX だけを呼び出します。Trace への拡張機能の使用は、config または起動時の少量のコードで実行できます。log4net を使用する場合は、どこでも参照する必要があります。

4

5 に答える 5

3

こちらの Ukadc.Diagnostics もご覧ください。

いくつかの TraceListeners が含まれています。さらに興味深いことに、フォーマット ステートメントを使用する機能が追加されています (log4net や NLog のサポートなど)。そのため、ログに記録するフィールド、フィールドの順序、少なくとも一部のフィールドのフォーマット (日付/時刻のフォーマットなど) など、ログファイルのレイアウトをより詳細に制御できます。独自の「トークン」を記述して、フォーマット ステートメントで参照することもできます。log4net や NLog ほど多くのフォーマット オプションをサポートしておらず、TraceListeners の数もほとんどサポートしていませんが、System.Diagnostics ベースのソリューションの場合、「すぐに使える」機能からの真のステップ アップです。 System.Diagnostics で利用できます。

于 2010-08-26T22:05:55.963 に答える
2

http://essentialdiagnostics.codeplex.com/は、デフォルトのトレースに拡張機能を提供します

于 2012-03-02T12:43:20.743 に答える
2

これはライブラリにはカウントされませんが、フォームにテキスト ボックスをドロップするだけで自動的にトレース出力を取得できるように、テキスト ボックス リスナーを 1 回作成しました。

  public class TraceLogTextBox : RichTextBox
  {
    private TraceListener listener;

    public TraceLogTextBox()
      : base()
    {
      listener = new TextBoxTraceListener(this);
      Trace.Listeners.Add(listener);
    }

    protected override void Dispose(bool disposing)
    {
      Trace.Listeners.Remove(listener);
      base.Dispose(disposing);
    }

  }

  public class TextBoxTraceListener : TraceListener
  {
    private RichTextBox txtBox;
    const string ERROR = "error";

    public TextBoxTraceListener(RichTextBox tbox)
      : base()
    {
      txtBox = tbox;
    }

    public override void Write(object o)
    {
      if (o is Exception)
      {
        Write(o.ToString(), ERROR);
      }
      else
      {
        Write(o.ToString());
      }
    }

    public override void Write(string message)
    {
      Write(message, string.Empty);
    }

    public override void Write(string message, string category)
    {
      Color col = category.ToLower() == ERROR ? Color.Red : Color.Black;
      txtBox.SelectionColor = col;
      if (category == string.Empty)
      {
        txtBox.SelectedText = message;
      }
      else
      {
        txtBox.SelectedText = string.Format("[{0}] {1}", category, message);
      }
    }

    public override void WriteLine(string message)
    {
      WriteLine(message, string.Empty);
    }

    public override void WriteLine(object o)
    {
      if (o is Exception)
      {
        WriteLine(o.ToString(), ERROR);
      }
      else
      {
        WriteLine(o.ToString());
      }
    }

    public override void WriteLine(string message, string category)
    {
      Color col = category.ToLower() == ERROR ? Color.Red : Color.Black;
      txtBox.SelectionColor = col;
      if (category == string.Empty)
      {
        txtBox.SelectedText = string.Format("{0}\n",message);
      }
      else
      {
        txtBox.SelectedText = string.Format("[{0}] {1}\n", category, message);
      }
    }
  }
于 2010-05-11T05:35:39.230 に答える
1

サード パーティの API に依存してビジネス コードを汚染したくない理由は理解できます。

ただし、System.Diagnostics.Trace は、EntLib や Log4Net などの他のログ フレームワークによって提供されるほど柔軟な API ではないことも事実です。

私が行ったのは、log4net の影響を強く受けた内部 API を開発したことです。この API は、プロバイダー モデルの設計パターンを使用して、適切なロギング フレームワークに薄いラッパーを提供します。System.Diagnostics.Trace、log4net、および EntLib のプロバイダーがあります。基本的な概念は、Common Infrastructure for .NETロギング ライブラリと非常によく似ています。

このように、ビジネス コードは独自の内部 API にのみ依存し、ロギング フレームワークは構成を使用して実行時に選択できます。

もちろん、System.Diagnostics.Trace に固執し、SMTP 用の独自の TraceListeners を作成するか (この CodeProject サンプルを参照)、ログをローリングすることで、目的を達成できます。または、Log4Net などのロギング フレームワークにリダイレクトする独自の TraceListener を作成すると、そのフレームワークでサポートされているロガーにアクセスできるようになります。

于 2010-05-11T06:17:59.807 に答える
1

Enterprise Library Logging Application Block は、System.Diagnostics.TraceSource などのクラスを「拡張」します。

于 2010-05-11T05:46:15.510 に答える