17

既存のすべての TraceSource の TraceListener を追加および削除する方法を探しています。

(ここでの私のアプローチが正しいかどうかはわかりません。他にどのような方法を使用できますか?基本的に、現在のプロジェクト名をファイル名として使用するファイルにすべてのトレース出力を記録したいと考えています。ユーザーがプロジェクトを作成または再度開くときはいつでも、ログを正しいファイルに追加します。一度に開くことができるプロジェクトは 1 つだけです。)

コード例:

クラスごとに 1 つずつ、アプリケーションに複数の TraceSource を作成します。

public class Class1
{
    private static readonly System.Diagnostics.TraceSource trace = 
            new System.Diagnostics.TraceSource("Class1");
}

public class Class2
{
    private static readonly System.Diagnostics.TraceSource trace = 
            new System.Diagnostics.TraceSource("Class2");
}

次のように、実行時にすべての traceSources に traceListener を追加または削除したいと考えています。

private System.Diagnostics.TextWriterTraceListener myListener;

private onProjectOpen()
{
    // user created a new project or opened an existing one
    myListener = new System.Diagnostics.TextWriterTraceListener("log-"+projectname+".log");
    ALL_TRACESOURCES.Add ( myListener) ; // <-- how to do this?
}

private onProjectClose()
{
    // user closed a project
    ALL_TRACESOURCES.Remove( myListener) ; // <-- how to do this?
    myListener.Flush();
    myListener.Close();
    myListener.Dispose(); // <-- not sure if all this is neccessary
}

これまでのところ、すべての traceSources を公開し (悪い考えのように思えます)、すべてのクラスを次のようにリストしない限り、これを行う方法が見つかりませんでした。

Class1.Trace.Add( myListener );
Class2.Trace.Add( myListener );
...

これは、いくつかのレベルで悪い設計の選択のようです。

または

すべての TraceSources を各クラスのコンストラクターのカスタム グローバル コレクションに追加します (簡単に忘れたり混乱させたりします。グローバル変数は良くありません)。

より良い方法はありますか?基本的に、別のデフォルトリスナーを設定する方法を探しています

4

4 に答える 4

0

私はちょうどこの問題に遭遇しました。私の場合、各クラスで作成されたトレース ソースもあります。app.config にあるリスナーはすべてのソースに問題なく追加されますが、実行時に追加する必要がある特定のリスナーがあります。もちろん、これはリスナーが追加されたトレースソースでのみ機能します。2 つのオプションがあります。1 つのトレース ソースを作成してアプリの残りの部分に渡すか (yuck)、他のすべてが参照するヘルパー クラスに 1 つの静的トレース ソースを配置します。ので、私は持っています:

public class LogHelper { /// /// The trace source logger for the application. /// public static readonly TraceSource Logger = new TraceSource("FruityBlergs", SourceLevels.All); }

LogHelper クラスは、実行時に構成されるリスナーとその他のさまざまなフィルターもセットアップします。これはこれまでのところうまくいきました。何らかの理由で特定のクラスが異なる動作を必要とする場合でも、そのクラスでトレース ソースを作成できます。

于 2014-09-03T01:46:01.257 に答える