次の方法で共有


メッセージ ログの構成

ここでは、さまざまなシナリオでのメッセージ ログの構成方法を示します。

メッセージ ログの有効化

Windows Communication Foundation (WCF) は、既定で、メッセージを記録しません。メッセージ ログをアクティブにするには、トレース リスナを System.ServiceModel.MessageLogging トレース ソースに追加し、構成ファイルで <messagelogging> 要素の属性を設定する必要があります。

以下に、ログの有効化と追加オプションの指定に関する例を示します。

<system.diagnostics>
  <sources>
      <source name="System.ServiceModel.MessageLogging">
        <listeners>
                 <add name="messages"
                 type="System.Diagnostics.XmlWriterTraceListener"
                 initializeData="c:\logs\messages.svclog" />
          </listeners>
      </source>
    </sources>
</system.diagnostics>

<system.serviceModel>
  <diagnostics>
    <messageLogging 
         logEntireMessage="true" 
         logMalformedMessages="false"
         logMessagesAtServiceLevel="true" 
         logMessagesAtTransportLevel="false"
         maxMessagesToLog="3000"
         maxSizeOfMessageToLog="2000"/>
  </diagnostics>
</system.serviceModel>

メッセージ ログの設定の詳細については、「トレースとメッセージ ログの推奨設定」を参照してください。

add を使用して、使用するリスナの名前と型を指定することができます。この例の構成では、リスナに "messages" という名前を付け、使用する型として標準の .NET Framework トレース リスナ (System.Diagnostics.XmlWriterTraceListener) を追加しています。System.Diagnostics.XmlWriterTraceListener を使用する場合は、構成ファイルで出力ファイルの場所と名前を指定する必要があります。指定するには、initializeData をログ ファイルの名前に設定します。それ以外の場合、例外がスローされます。また、既定のファイルにログを出力するカスタム リスナを実装することもできます。

ms730064.Caution(ja-jp,VS.90).gif注意 :
メッセージ ログはディスク領域を消費するため、ディスクに書き込む特定のサービスのメッセージ数を制限する必要があります。メッセージ数が上限に達すると、情報レベルでのトレースが生成され、すべてのメッセージ ログ処理が停止します。

ログ レベルと追加オプションについては、「ログ レベルとオプション」のセクションで説明します。

sourceswitchValue 属性は、トレースに対してのみ有効です。switchValue 属性を System.ServiceModel.MessageLogging トレース ソースに対して次のように指定しても無効です。

<source name="System.ServiceModel.MessageLogging" switchValue="Verbose">

トレース ソースを無効にする場合は、代わりに messageLogging 要素の logMessagesAtServiceLevel 属性、logMalformedMessages 属性、および logMessagesAtTransportLevel 属性を使用する必要があります。これらすべての属性を false に設定します。この設定を行うには、構成エディタ UI インターフェイスで前のコード例の構成ファイルを使用するか、または WMI を使用します。構成エディタ ツールの詳細については、「Configuration Editor Tool (SvcConfigEditor.exe)」を参照してください。WMI の詳細については、「診断用の WMI (Windows Management Instrumentation) の使用」を参照してください。

ログ レベルとオプション

受信メッセージの場合は、メッセージが形成された直後、サービス レベルでメッセージがユーザー コードで処理される直前、および不正メッセージが検出されたときに、ログが記録されます。

送信メッセージの場合は、メッセージがユーザー コードから出力された直後およびメッセージがネットワークに出力される直前に、ログが記録されます。

WCF は、サービスとトランスポートの 2 種類のレベルでメッセージを記録します。不正なメッセージも記録されます。3 つのカテゴリは互いに独立しており、構成で個別に有効にすることができます。

messageLogging 要素の logMessagesAtServiceLevellogMalformedMessages、および logMessagesAtTransportLevel の各属性を設定することによって、ログ レベルを制御することができます。

サービス レベル

このレイヤでは、ユーザー コードに入力 (受信時) される直前、またはユーザー コードから出力 (送信時) される直前のメッセージが記録されます。フィルタを定義した場合は、そのフィルタと一致するメッセージだけが記録されます。それ以外の場合は、サービス レベルのすべてのメッセージが記録されます。このレベルでは、インフラストラクチャ メッセージ (トランザクション、ピア チャネル、およびセキュリティ) も記録されます。ただし、信頼できるメッセージング メッセージは記録されません。ストリーム メッセージの場合は、ヘッダーだけが記録されます。また、セキュリティで保護されたメッセージもこのレベルで復号化されて記録されます。

トランスポート レベル

このレイヤで記録されるメッセージは、ネットワーク上での転送に向けてエンコードできる状態になっているもの、および転送後にデコードできる状態になっているものです。フィルタを定義した場合は、そのフィルタと一致するメッセージだけが記録されます。それ以外の場合は、トランスポート レイヤのすべてのメッセージが記録されます。このレイヤでは、信頼できるメッセージング メッセージを含むすべてのインフラストラクチャ メッセージが記録されます。ストリーム メッセージの場合は、ヘッダーだけが記録されます。また、セキュリティで保護されたメッセージも、HTTPS などのセキュリティで保護されたトランスポートを使用している場合を除き、暗号化された状態でこのレベルで記録されます。

不正レベル

不正なメッセージとは、処理の任意の段階で WCF スタックによって拒否されたメッセージのことです。不正なメッセージはそのままの状態で記録されます。適切ではない XML などによって形式が不正である場合は、暗号化されます。maxSizeOfMessageToLog は、CDATA として記録されるメッセージのサイズを定義します。maxSizeOfMessageToLog の既定値は 256 K です。この属性の詳細については、「その他のオプション」を参照してください。

その他のオプション

ログ レベルの他に、次のオプションを指定することができます。

  • 全体メッセージの記録 (logEntireMessage 属性) : この値は、全体メッセージ (メッセージ ヘッダーと本文) を記録するかどうかを指定します。既定値は、false で、ヘッダーだけ記録することを意味します。この設定は、サービス メッセージ ログ レベルおよびトランスポート メッセージ ログ レベルに影響を与えます。
  • 記録するメッセージの最大数 (maxMessagesToLog 属性) : この値は、記録するメッセージの最大数を指定します。すべてのメッセージ (サービス メッセージ、トランスポート メッセージ、および不正メッセージ) が、このクォータに対してカウントされます。クォータに達すると、トレースが出力され、それ以上メッセージは記録されません。既定値は 10000 です。
  • 記録するメッセージの最大サイズ (maxSizeOfMessageToLog 属性) : この値は、記録するメッセージの最大サイズをバイト単位で指定します。サイズ制限を超えたメッセージは記録されず、そのメッセージに対して何の処理も実行されません。この設定は、すべてのトレース レベルに影響を与えます。ServiceModel トレースがオンの場合は、最初の記録ポイントで警告レベル トレース(ServiceModelSend* または TransportReceive) が出力され、ユーザーに通知します。サービス レベルとトランスポート レベルのメッセージの既定値は 256 K ですが、不正メッセージの既定値は 4 K です。注意   maxSizeOfMessageToLog と照合するために計算されるメッセージ サイズは、シリアル化される前のメモリ上でのメッセージ サイズです。このサイズは、記録されるメッセージ文字列の実際の長さとは異なります。実際のサイズよりも大きい場合がほとんどです。その結果、メッセージが記録されない場合があります。maxSizeOfMessageToLog 属性をメッセージの見積もりサイズよりも 10% 大きく設定することによって、この現象を回避することができます。また、不正メッセージを記録する場合は、メッセージ ログに使用する実際のディスク領域を、maxSizeOfMessageToLog で指定した値の最大 5 倍にすることができます。

構成ファイルでトレース リスナを定義していない場合は、ログ レベルの指定に関係なくログ出力は生成されません。

このセクションで説明されている属性などのメッセージ ログ オプションは、実行時に WMI (Windows Management Instrumentation) を使用して変更できます。変更するには、LogMessagesAtServiceLevelLogMessagesAtTransportLevel、および LogMalformedMessages のブール型プロパティを公開する AppDomainInfo インスタンスにアクセスします。そのため、メッセージ ログ用のトレース リスナを構成していても、これらのオプションを構成で false に設定している場合は、後でアプリケーションを実行しているときに true に変更できます。これで、メッセージ ログが実行時に有効になります。同様に、構成ファイルでメッセージ ログを有効にしている場合は、実行時に WMI を使用して無効にできます。詳細については、「診断用の WMI (Windows Management Instrumentation) の使用」を参照してください。

メッセージ ログの source フィールドは、要求メッセージを送信または受信する際に要求/応答または一方向の要求については、サービス モデル レイヤまたはトランスポート レイヤで、または不正メッセージの場合に、メッセージを記録するコンテキストを指定します。

不正メッセージの場合、source は、Malformed になります。それ以外の場合、source には、コンテキストに基づいて、以下の値が設定されます。

要求/応答の場合

Send Request Receive Request Send Reply Receive Reply

Service Model layer

Service

Level

Send

Request

Service

Level

Receive

Request

Service

Level

Send

Reply

Service

Level

Receive

Reply

Transport layer

Transport

Send

Transport

Receive

Transport

Send

Transport

Receive

一方向の要求の場合

Send Request Receive Request

Service Model layer

Service

Level

Send

Datagram

Service

Level

Receive

Datagram

Transport layer

Transport

Send

Transport

Receive

メッセージ フィルタ

メッセージ フィルタは、diagnostics 構成セクションの messageLogging 構成要素で定義されます。これらは、サービス レベルとトランスポート レベルで適用されます。1 つ以上のフィルタを定義した場合は、少なくとも 1 つのフィルタと一致するメッセージだけが記録されます。フィルタを定義しなかった場合は、すべてのメッセージが通過します。

フィルタは、完全な XPath 構文をサポートし、構成ファイルでの出現順に適用されます。構文的に不正なフィルタによって、構成例外が発生します。

フィルタは、フィルタに一致するかどうかを確認できる、XPath DOM 内のノードの最大数を制限する nodeQuota 属性を使用することで、安全機能も提供します。

SOAP ヘッダー セクションがあるメッセージだけを記録するフィルタの設定方法の例を次に示します。

<messageLogging logEntireMessage="true"
    logMalformedMessages="true" 
    logMessagesAtServiceLevel="true"
    logMessagesAtTransportLevel="true"
    maxMessagesToLog="420">
    <filters>
        <add nodeQuota="10" xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
                 /soap:Envelope/soap:Header
        </add>
     </filters>
</messageLogging>

フィルタは、メッセージの本文には適用できません。メッセージの本文を操作しようとするフィルタは、フィルタの一覧から削除されます。その場合には、このことを示すイベントも出力されます。たとえば、次のフィルタは、フィルタ テーブルから削除されます。

<add xmlns:s="https://schemas.xmlsoap.org/soap/envelope/">/s:Envelope/s:Body[contains(text(), "Hello")]</add>

カスタム リスナの構成

追加オプションでカスタム リスナを構成することもできます。カスタム リスナは、記録を行う前に、アプリケーション固有の PII 要素をメッセージからフィルタ処理するのに役立ちます。カスタム リスナの構成を次に示します。

<system.diagnostics>
   <sources>
     <source name="System.ServiceModel.MessageLogging">
           <listeners>
             <add name="MyListener" 
                    type="YourCustomListener"
                    initializeData="c:\logs\messages.svclog"
                    maxDiskSpace="1000"/>
           </listeners>
     </source>
   </sources>
</system.diagnostics>

type 属性は、型のアセンブリ修飾名に設定する必要があることに注意してください。

関連項目

概念

トレースとメッセージ ログの推奨設定

その他の技術情報

<messageLogging>
メッセージ ログ