2

私は(学習目的で)独自のイベントロガーを構築しようとしています。.net をよりよく理解するためにこれを行っているため、独自のフレームワークを構築する代わりに、.net 以外のフレームワークを使用することについて聞くことに興味はありません。

アイデアは、プログラム内でログ ファイルに書き込んだり、プルしたりできるイベント システムを用意することです。これを行うために、LogEventの中に格納されるクラスを作成していQueue<LogEvent>ます。

LogEventクラスで次のフィールドを使用する予定です。

private EventLogEntryType _eventType //enum: error, info, warning...
private string _eventMessage
private Exception _exception
private DateTime _eventTime

イベントが呼び出される原因となったオブジェクトをキャプチャする最良の方法はよくわかりません。ただやろprivate Object _eventObject;うと思ったのですが、それはスレッドセーフでもセキュアでもないと考えています。

イベントを呼び出したオブジェクトを最適に保存する方法についてのアドバイスをいただければ幸いです。また、その他のご提案もお待ちしております。

ありがとう、トニー

4

1 に答える 1

2

まず、自分で書いても問題ありません。そこにはいくつかの優れたフレームワークがありますが、奇妙な要件のために独自のフレームワークを作成するようになることがあります.とにかくそこにいました
.テキストメッセージを使用する必要はないと思います. いくつかのプロジェクトでこのタイプのロギングを行った後、最良のアプローチは、ある種の追加情報フィールドを持つ一連のイベント タイプ (整数 ID) を持つことであるという結論に達しました。LogEvetTypes次のような列挙型が必要です。

public enum LogEventTypes
{
    //1xxx WS Errors
    ThisOrThatWebServiceError = 1001,

    //2xxx DB access error


    //etc...
}

これは、私の経験から、ログに記録した情報を利用しようとするときに、あなたの人生をずっと楽にしてくれます. ExtraInformationイベント インスタンス固有の情報を提供するために、フィールドを追加することもできます。

イベントの原因となったオブジェクトについては、 のようなものを使用しますtypeof(YourClass).ToString();。これが作成したカスタム クラスである場合はToString、ロギング コンテキストで意味のある名前を付けるオーバーライドを実装することもできます。

編集:重要だと思うので、コメントに書いたいくつかの詳細を追加します。不変ではないオブジェクトを ref によってサービス メソッドに渡すことは、一般的には良い考えではありません。ループ内で同じ変数を再割り当てして (たとえば)、見つけるのがほぼ不可能なバグを作成する可能性があります。また、ロギング インフラストラクチャをアプリケーションの実装の詳細から分離するために、追加の作業を今すぐ行うことをお勧めします。これは、私自身の非常につらい経験から言っています。

于 2012-12-17T02:25:33.877 に答える