トレースの構成

ここでは、トレースを有効にする方法、トレースを出力し、トレース レベルを設定するようにトレース ソースを構成する方法、エンドツーエンドのトレース相関をサポートするようにアクティビティ トレースと伝達を設定する方法、およびトレースにアクセスするようにトレース リスナーを設定する方法について説明します。

運用環境またはデバッグ環境でのトレースの推奨設定については、「トレースとメッセージ ログの推奨設定」を参照してください。

重要

Windows 8 でアプリケーションによるトレース ログの生成を行うには、アプリケーションを権限の高い状態で実行 (管理者として実行) する必要があります。

トレースの有効化

Windows Communication Foundation (WCF) は次の診断トレース データを出力します。

  • 操作呼び出し、コード例外、警告、その他の重要な処理イベントなど、アプリケーションのすべてのコンポーネントにおける処理マイルストーンのトレース。

  • トレース機能が正しく動作しないときの Windows エラー イベント。 イベント ログに関する記事を参照してください。

WCF トレースは、System.Diagnostics に基づいています。 トレースを使用するには、構成ファイルまたはコードでトレース ソースを定義する必要があります。 WCF は、WCF アセンブリごとにトレース ソースを定義します。 System.ServiceModel トレース ソースは最も一般的な WCF トレース ソースで、トランスポートへの出入りからユーザー コードへの出入りまで、WCF 通信スタック全体の処理マイルストーンを記録します。 System.ServiceModel.MessageLogging トレース ソースは、システムを通過するすべてのメッセージを記録します。

既定では、トレースは無効です。 トレースを有効にするには、トレース リスナーを作成し、構成で選択したトレース ソースのトレース レベルを "Off" 以外に設定する必要があります。それ以外の場合、WCF はトレースを生成しません。 リスナーを指定しないと、トレースは自動的に無効になります。 リスナーを定義してもトレース レベルを指定しないと、トレース レベルは既定で "Off" に設定され、トレースが出力されなくなります。

WCF 機能拡張ポイント (カスタム操作の呼び出し元など) を使用する場合、独自のトレースを出力する必要があります。 これは、機能拡張ポイントを実装すると、WCF が既定のパスに標準のトレースを出力できなくなるためです。 トレースを出力することで手動トレースのサポートを実装しない場合、予測したトレースが得られない場合があります。

トレースは、アプリケーションの構成ファイル (Web ホスト型アプリケーションの場合は Web.config、自己ホスト型アプリケーションの場合は Appname.exe.config) を編集することで構成できます。 以下は、このような編集の例です。 これらの設定の詳細については、「トレースを使用するためのトレース リスナーの構成」のセクションを参照してください。

<configuration>  
   <system.diagnostics>  
      <sources>  
         <source name="System.ServiceModel"
                    switchValue="Information, ActivityTracing"  
                    propagateActivity="true">  
            <listeners>  
               <add name="traceListener"
                   type="System.Diagnostics.XmlWriterTraceListener"
                   initializeData= "c:\log\Traces.svclog" />  
            </listeners>  
         </source>  
      </sources>  
   </system.diagnostics>  
</configuration>  

Note

Visual Studio で WCF サービス プロジェクトの構成ファイルを編集するには、ソリューション エクスプローラーでアプリケーションの構成ファイル (Web ホスト型アプリケーションの場合は Web.config、自己ホスト型アプリケーションの場合は Appname.exe.config) を右クリックします。 次に、 [WCF 構成の編集] コンテキスト メニュー項目を選択します。 これによって構成エディター ツール (SvcConfigEditor.exe) が開き、グラフィカル ユーザー インターフェイスを使用して WCF サービスの構成設定を変更できます。

トレースを出力するためのトレース ソースの構成

WCF は、アセンブリごとにトレース ソースを定義します。 アセンブリ内で生成されたトレースは、該当するソースで定義されているリスナーによってアクセスされます。 次のトレース ソースが定義されます。

  • System.ServiceModel: 構成の読み取り、トランスポートでのメッセージの処理、セキュリティ処理、ユーザー コードでのメッセージのディスパッチなど、WCF 処理のすべての段階を記録します。

  • System.ServiceModel.MessageLogging: システムを通過するすべてのメッセージを記録します。

  • System.IdentityModel

  • System.ServiceModel.Activation

  • System.IO.Log: Common Log File System (CLFS) への .NET Framework インターフェイスを記録します。

  • System.Runtime.Serialization: オブジェクトの読み取りまたは書き込みを記録します。

  • CardSpace

各トレース ソースは、次の構成例に示すように同じ (共有) リスナーを使用するように構成できます。

<configuration>  
    <system.diagnostics>  
        <sources>  
            <source name="System.ServiceModel"
                    switchValue="Information, ActivityTracing"  
                    propagateActivity="true">  
                <listeners>  
                    <add name="xml" />  
                </listeners>  
            </source>  
            <source name="CardSpace">  
                <listeners>  
                    <add name="xml" />  
                </listeners>  
            </source>  
            <source name="System.IO.Log">  
                <listeners>  
                    <add name="xml" />  
                </listeners>  
            </source>  
            <source name="System.Runtime.Serialization">  
                <listeners>  
                    <add name="xml" />  
                </listeners>  
            </source>  
            <source name="System.IdentityModel">  
                <listeners>  
                    <add name="xml" />  
                </listeners>  
            </source>  
        </sources>  
  
        <sharedListeners>  
            <add name="xml"  
                 type="System.Diagnostics.XmlWriterTraceListener"  
                 initializeData="c:\log\Traces.svclog" />  
        </sharedListeners>  
    </system.diagnostics>  
</configuration>  

さらに、次の例に示すように、ユーザー定義のトレース ソースを追加してユーザー コード トレースを出力することもできます。

<system.diagnostics>  
   <sources>  
       <source name="UserTraceSource" switchValue="Warning, ActivityTracing" >  
          <listeners>  
              <add name="xml"  
                 type="System.Diagnostics.XmlWriterTraceListener"  
                 initializeData="C:\logs\UserTraces.svclog" />  
          </listeners>  
       </source>  
   </sources>  
   <trace autoflush="true" />
</system.diagnostics>  

ユーザー定義のトレース ソースの作成の詳細については、「トレースの拡張」を参照してください。

トレースを使用するためのトレース リスナーの構成

WCF により、実行時にトレース データを処理するリスナーにデータが送信されます。 WCF は System.Diagnostics に出力の形式が異なる複数の定義済みリスナーを提供します。 カスタム リスナーの種類を追加することもできます。

add を使用して、使用するトレース リスナーの名前と種類を指定できます。 この例の構成では、リスナーに traceListener という名前を付け、使用する種類として標準の .NET Framework トレース リスナー (System.Diagnostics.XmlWriterTraceListener) を追加しています。 ソースごとに任意の数のトレース リスナーを追加できます。 トレース リスナーがトレースをファイルに出力する場合は、構成ファイルで出力ファイルの場所と名前を指定する必要があります。 指定するには、initializeData をそのリスナーのファイルの名前に設定します。 ファイル名を指定しないと、使用するリスナーの種類に基づいて任意のファイル名が生成されます。 XmlWriterTraceListener を使用した場合は、拡張子のないファイル名が生成されます。 カスタム リスナーを実装した場合は、この属性を使用して、ファイル名以外の初期化データを受け取ることもできます。 たとえば、この属性にデータベース識別子を指定できます。

カスタム トレース リスナーは、ネットワーク上のリモート データベースなどにトレースを送信するように構成できます。 アプリケーションを展開するユーザーは、リモート コンピューターのトレース ログに適切なアクセス制御を適用する必要があります。

また、トレース リスナーはプログラムによって構成することもできます。 詳細については、「方法: トレース リスナーを作成し初期化する」と「Creating a Custom TraceListener」を参照してください。

注意事項

System.Diagnostics.XmlWriterTraceListener はスレッド セーフではないため、トレース ソースは、トレースを出力するときにリソースを排他的にロックする可能性があります。 このリスナーを使用するように構成されたトレース ソースに多くのスレッドがトレースを出力すると、リソースの競合が発生し、パフォーマンスに重大な問題が生じる場合があります。 この問題を解決するには、スレッド セーフなカスタム リスナーを実装する必要があります。

トレース レベル

トレース レベルは、トレース ソースの switchValue 設定で制御します。 使用できるトレース レベルを次の表に示します。

トレース レベル 追跡イベントの性質 追跡イベントの内容 追跡イベント 対象ユーザー
Off N/A N/A トレースは出力されません。 該当なし
Critical "否定的" イベント: 予期しない処理またはエラー状態を示すイベント。 次の例を含む未処理の例外が記録されます。

- OutOfMemoryException
- ThreadAbortException (CLR が任意の ThreadAbortExceptionHandler を呼び出します)
- StackOverflowException (キャッチできません)
- ConfigurationErrorsException
- SEHException
- アプリケーションの起動エラー
- フェイルファースト イベント
- システム ハング
- 有害メッセージ : アプリケーションを失敗させるメッセージ トレース。
管理者

アプリケーション開発者
エラー "否定的" イベント: 予期しない処理またはエラー状態を示すイベント。 予期しない処理が発生した。 アプリケーションが、タスクを正常に実行できなかった。 ただし、アプリケーションは依然として動作している。 すべての例外がログに記録されます。 管理者

アプリケーション開発者
警告 "否定的" イベント: 予期しない処理またはエラー状態を示すイベント。 問題が発生したか、発生する可能性があるが、アプリケーションは正常に動作している。 ただし、正常な動作を継続できなくなる可能性がある。 - アプリケーションが、調整設定の範囲を超えた数の要求を受信している。
- 受信側キューが構成された最大の容量に近づいている。
- タイムアウトを超えた。
- 資格情報が拒否される。
管理者

アプリケーション開発者
説明 "肯定的" イベント : 正常なマイルストーンを示すイベント。 アプリケーションが正常に動作しているかどうかとは無関係の、アプリケーションの実行に関する重要で正常なマイルストーン。 一般に、システム ステータスの監視と診断、パフォーマンスの計測、またはプロファイリングに有用なメッセージが生成されます。 この情報は、キャパシティ プランニングやパフォーマンス管理のために利用できます。

- チャネルが作成される。
- エンドポイントのリスナーが作成される。
- メッセージがトランスポートに入る、またはトランスポートから離れる。
- セキュリティ トークンが取得される。
- 構成設定が読み取られる。
管理者

アプリケーション開発者

製品開発者。
"詳細" "肯定的" イベント : 正常なマイルストーンを示すイベント。 ユーザー コードとサービスの両方に対する低レベルのイベントが出力されます。 一般に、このレベルはデバッグやアプリケーションの最適化に利用できます。

- 認識されたメッセージ ヘッダー。
管理者

アプリケーション開発者

製品開発者。
ActivityTracing 処理アクティビティとコンポーネント間のフロー イベント。 このレベルを使用すると、管理者と開発者は同じアプリケーション ドメイン内のアプリケーションの相関関係を示すことができます。

- start/stop など、アクティビティ境界のトレース。
- 転送のトレース。
すべて
All アプリケーションが正常に動作している可能性があります。 すべてのイベントが出力されます。 前のすべてのイベント。 All

Verbose から Critical までのレベルは相互にスタックされます。つまり、各トレース レベルには、そのレベルよりも上位のすべてのレベルが含まれます (Off レベルを除く)。 たとえば、Warning レベルでリッスンしているリスナーは、Critical、Error、Warning の各トレースを受け取ります。 All レベルには、Verbose から Critical までのイベントとアクティビティ トレース イベントが含まれます。

注意事項

Information、Verbose、および ActivityTracing の各レベルは、多くのトレースを生成するため、コンピューターで利用可能なすべてのリソースを使い果たした場合は、メッセージ スループットに悪影響を及ぼす可能性があります。

アクティビティ トレースと伝達の関連付けの構成

activityTracing 属性に指定する switchValue 値を使用してアクティビティ トレースを有効にし、エンドポイント内のアクティビティの境界と転送のトレースを出力できます。

Note

WCF の特定の拡張機能を使用する場合に、アクティビティ トレースが有効になっていると、NullReferenceException が発生することがあります。 この問題を解決するには、アプリケーションの構成ファイルを調べて、トレース ソースの switchValue 属性が activityTracing に設定されていないことを確認します。

propagateActivity 属性は、メッセージ交換に参加している他のエンドポイントにアクティビティを伝達する必要があるかどうかを示します。 この値を true に設定すると、任意の 2 つのエンドポイントで生成されたトレース ファイルを取得し、一方のエンドポイントのトレース セットがもう一方のエンドポイントのトレース セットにどのように転送されるかを監視できます。

アクティビティのトレースと伝達の詳細については、「伝達」を参照してください。

propagateActivity ブール値と ActivityTracing ブール値は共に System.ServiceModel TraceSource に適用されます。 また、ActivityTracing 値は、WCF またはユーザー定義トレース ソースを含む任意のトレース ソースに適用されます。

ユーザー定義のトレース ソースでは、propagateActivity 属性を使用できません。 ユーザー コード アクティビティ ID の伝達では、ServiceModel ActivityTracing 属性を propagateActivity に設定しているときは、ServiceModel true を設定しないでください。

関連項目