2

FirebirdSQL のログ記録を無効にするには、次のコード (ここを参照) を app.configに追加する必要があります。

<system.diagnostics>
    <sources>
      <source name="FirebirdSql.Data.FirebirdClient" switchValue="Off">
        <listeners>
          <clear />
        </listeners>
      </source>
    </sources>
  </system.diagnostics>

これは成功します。つまり、何も記録されません。今、私は C# コードでこれを行いましたが、私のコードにもかかわらずすべてがログに記録されます:

TraceSource ts = new TraceSource("FirebirdSql.Data.FirebirdClient");
ts.Switch = new SourceSwitch("sourceSwitch", "Off");
var listeners = ts.Listeners;
listeners.Clear();
ts.Switch.Level = SourceLevels.Off;

これを SQL ステートメントを実行するアセンブリに追加しました。

私は何が欠けていますか?

4

1 に答える 1

1

これにより、登録方法 (コードまたは構成) に関係なく、すべてのトレース ソースが無効になります。

TraceSource を (コードまたは構成で) 作成すると、静的リストに追加されます。そのリストを取得するためのパブリック API はありません。しかし、その「プライベート」というキーワードは、私たちではなく、下位の開発者が従うべき兆候です。したがって、それをキックダウンして、当然のことながら私たちのものである変数への参照を取得しました。次に、リスナーを追加/削除し、トレース フラグをオフにします。トレースを無効にする方法は複数あります。

この例は単一のメソッドで機能しますが、この例のように TraceSource への参照がなくても、この手法は機能するはずです。

TraceSource source = new TraceSource("foo");
SourceSwitch onOff = new SourceSwitch("onOff", "Verbose");

onOff.Level = SourceLevels.Verbose;

ConsoleTraceListener console = new ConsoleTraceListener();

source.Switch = onOff;
bool alreadyDone = false;
foreach (var listener in source.Listeners)
{
    if (typeof(ConsoleTraceListener) == listener.GetType())
    {
        alreadyDone = true;
    }
}
if (!alreadyDone)
{
    source.Listeners.Add(console);
}

source.TraceInformation("Hellow World! The trace is on!");

List<WeakReference>  traceSources = 
           (List<WeakReference>)typeof(TraceSource)
               .GetField("tracesources", BindingFlags.NonPublic | BindingFlags.Static)
               .GetValue(source);

foreach (WeakReference weakReference in traceSources)
{
    TraceSource target = (TraceSource)weakReference.Target;
    source.TraceInformation(
          "Somebody, in code or config, registered this trace source " + target.Name);
    target.Listeners.Clear();
}
source.TraceInformation(
       "Can you still see this? (No you can't, I cleared all the listeners)");
于 2013-06-07T17:45:21.917 に答える