0

Trace.TraceInformation/Warning/Error は、TraceSwitch で設定されたレベルを尊重すると思います。

調査の結果、TraceSwitch インスタンスはいくつでも存在できることが明らかになったため、どのインスタンスが動作を制御する必要があるかは明確ではありません。TraceSwitch インスタンスのレベルを config から取得する方法があります。インスタンスを作成するときに、一致する名前を指定するだけです。

私が設計した場合、Trace クラスには、config の最初のトレース スイッチ定義によって設定される静的プロパティ TraceSwitch があり、TraceInfo などのメソッドは次のように動作します。

    public static void TraceInformation(string message, params object[] p)
    {
      if (TraceSwitch.TraceInfo)
        //base behaviour
    }

これをラッパーとして作成するのは難しくありませんでした。

namespace System.Diagnostics
{
  public static class TraceEx
  {
    private static TraceSwitch __traceSwitch;
    public static TraceSwitch TraceSwitch
    {
      get { return __traceSwitch; }
      set { __traceSwitch = value; }
    }
    static TraceEx()
    {
      __traceSwitch = new TraceSwitch("Default", "Default trace level is Off");
    }
    public static void TraceError(string message, params object[] p)
    {
      if (TraceSwitch.TraceError)
        Trace.TraceError(message, p);
    }
    public static void TraceInformation(string message, params object[] p)
    {
      if (TraceSwitch.TraceInfo)
        Trace.TraceInformation(message, p);
    }
    public static void TraceWarning(string message, params object[] p)
    {
      if (TraceSwitch.TraceWarning)
        Trace.TraceWarning(message, p);
    }
    public static void Write(string message, params object[] p)
    {
      if (TraceSwitch.TraceVerbose)
        Trace.Write(string.Format(message, p));
    }
    public static void WriteLine(string message, params object[] p)
    {
      Write(message + "\r\n", p);
    }
  }
}

これを同じ名前空間に配置するということは、プロジェクトを参照して Trace の名前を TraceEx に変更するだけでよいということです。私が提起している質問はこれです: なぜマイクロソフトはこのようにしなかったのですか? 私が見たことのない迫り来る落とし穴はありますか?


まあ、それは予想外でした(受け入れられた回答を参照)。これは、私がグランドデザインを理解していなかったと疑ったことが正しかったことを示すだけです. 上記のすべては次のようになります。

<userSettings>
    <TraceFilterExperiment.Properties.Settings>
        <setting name="TraceLevel" serializeAs="String">
            <value>Warning</value>
        </setting>
    </TraceFilterExperiment.Properties.Settings>
</userSettings>

var eventTypeFilter = new EventTypeFilter(Properties.Settings.Default.TraceLevel);
foreach (TraceListener L in Trace.Listeners) 
  L.Filter = eventTypeFilter;

しかし、TraceSwitch で実際に何ができるかについては、まだ漠然としています。

4

1 に答える 1

2

提案している動作は、多少異なる形式ではありますが、すでに存在しています。リスナーを変更して、さまざまなエラーレベルを有効にします。

提案された動作では、さまざまなレベルをさまざまな場所に送信します(たとえば、ログファイルに詳細情報を送信しますが、コンソールには重大なエラーのみを送信します)。デフォルトのトレーススイッチを「すべてを許可」に設定する必要があります。既存の動作。言い換えると、プログラマーが意図したとおりにトレーススイッチを使用したい場合は、すべてを許可するダミーのトレーススイッチを作成し、それが最初に定義されたトレーススイッチであることを確認する必要があります。たとえば、スイッチが他の構成ファイル(つまり、application.exe.configではない)で定義されている可能性は十分にあり、構成ファイルがロードされる順序を保証する方法はありません。

クラス自体は、Trace提案しているポリシーを適用する場所ではありません。Traceトレースメッセージを送信して配布できる共通のインターフェイスと一元化されたポイントを提供するために存在します。送信される情報を(トレーススイッチを介して)決定するのはアプリケーションの仕事であり、その情報が出力されるかどうかを決定するのはリスナーの仕事です。

提案する動作により、Traceの特定のアプリケーションで作業が簡単になります。それはそれを混乱させ、より困難にし、そしておそらく他のすべてのアプリケーションにとって一貫性のないものにします。

于 2012-12-17T02:17:32.143 に答える