2016-10-03 9 views
1

私は、プロダクションの1台のマシンでのみ起こっているWPFバインディングの問題をデバッグしようとしています。 。これを行うために、私はバインディングトレース情報をログファイルに出力しようとしています。答えlike this oneに続いて、私はApp.configファイルで設定することにより、ハードコーディングされた場所に出力するようにそれを得ることができました:WPFバインディングエラートレース情報をコードにコンフィグレーションされたログファイルに書き込むことができません

<system.diagnostics> 
    <sources> 
    <source name="System.Windows.Data" switchName="SourceSwitch" > 
     <listeners> 
     <add name="textListener" /> 
     </listeners> 
    </source> 
    </sources> 

    <switches> 
    <add name="SourceSwitch" value="All" /> 
    </switches> 

    <sharedListeners> 
    <add name="textListener" 
    type="System.Diagnostics.TextWriterTraceListener" 
    initializeData="c:\BindingErrors.log" /> 
    </sharedListeners> 

    <trace autoflush="true" indentsize="4"/> 
</system.diagnostics> 

私はc:\ドライブへの管理者権限を持っているここは、私のマシン上で正常に動作します。問題は、ユーザーが権限を持っている場所のどこかにログを書きたいということです。それらのTEMPフォルダだから私は%TEMP%環境変数を使用して、このような何かをしたい:

initializeData="%TEMP%\BindingErrors.log" 

これは、しかし、動作していない、と私はそれが動作しません推測する - see this answer。その回答のアドバイスに従って、私はApp.configの代わりにコード経由で出力を設定しようとしました。ここで私はこれまで試したものです:

var listener = new 
    TextWriterTraceListener(Environment.ExpandEnvironmentVariables(
    @"%TEMP%\BindingErrors.log"), "myListener"); 

Trace.Listeners.Add(listener); 
Trace.WriteLine("foo"); // just to see if it works at all. 
Trace.Flush(); 

をしかし、これは唯一の%TEMP%フォルダ内のログファイルにfooを書き込みます。バインディングエラーは書き込まれません。私はApp.configファイルが持っていたものを複製しようとしたが、ないSourcesコレクションがありませんので、私はTraceSourceをインスタンス化するとき、次のように:

var source = new TraceSource("mySource", SourceLevels.Information); 

私はそれで何をすべきか知っている、とノーがありますしないでくださいListeners私が追加できるコレクションlistenerインスタンス。

MSDNは私のためにすべてを集めているようではない、またはいくつかの重要な詳細が欠落しています。誰かが私が間違っていることを理解するのを助けてくれますか?

答えて

1

&hellip;リスナーインスタンスにリスナーインスタンスを追加することはできません。

実際、ある:PresentationTraceSources.DataBindingSource.Listeners

プロパティがメッセージをバインディングデータが出力されるときに使用されるTraceSourceオブジェクトを返します。コードソースで作成したTextWriterTraceListenerなどのリスナーをそのソースに追加するには、%TEMP%環境変数を展開し、出力ファイルのディレクトリとして使用します。

プログラムによるアプローチでは、出力場所を変更するために再コンパイルするか、実行時に読み取ることができる他の設定値を追加する必要があることに注意してください。別の手法では、環境変数を拡張する方法を知っているカスタムTraceListenerを実装することによって、app.configファイル内の構成全体を指定することができます。例えば

:アプリに続い

namespace TestSO39836570TraceListenerBindingErrors 
{ 
    class EnvironmentAwareTextWriterTraceListener : TextWriterTraceListener 
    { 
     public EnvironmentAwareTextWriterTraceListener(string path) 
      : base(Environment.ExpandEnvironmentVariables(path)) 
     { } 

     public EnvironmentAwareTextWriterTraceListener(string path, string name) 
      : base(Environment.ExpandEnvironmentVariables(path), name) 
     { } 
    } 
} 

。設定ファイルは、リスナーを指定することができます。

<system.diagnostics> 
    <sources> 
    <source name="System.Windows.Data" switchName="SourceSwitch"> 
     <listeners> 
     <add name="textListener"/> 
     </listeners> 
    </source> 
    </sources> 

    <switches> 
    <add name="SourceSwitch" value="All"/> 
    </switches> 

    <sharedListeners> 
    <add name="textListener" 
     type="TestSO39836570TraceListenerBindingErrors.EnvironmentAwareTextWriterTraceListener, TestSO39836570TraceListenerBindingErrors" 
     initializeData="%temp%\BindingErrors.log"/> 
    </sharedListeners> 

    <trace autoflush="true" indentsize="4"/> 
</system.diagnostics> 

注意を独自のプログラムのアセンブリで発見されたカスタムTraceListenerタイプを指定するとき、あなたはfully-に従うことによって、type属性にアセンブリ名を指定する必要があること(上記の例では、型の名前空間はVisual Studioで作成されたプロジェクトの既定値と同じアセンブリ名になります)。

ここで使用したものよりも短い名前空間と型名を使用することもできます。 :)

+0

ありがとう、ピーター! –

関連する問題