このトピックでは、さまざまなシナリオでメッセージ ログを構成する方法について説明します。
メッセージ ログの有効化
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
をログ ファイルの名前に設定します。 それ以外の場合、例外がスローされます。 既定のファイルにログを出力するカスタム リスナーを実装することもできます。
注
メッセージ ログはディスク領域にアクセスするため、特定のサービスのディスクに書き込まれるメッセージの数を制限する必要があります。 メッセージの制限に達すると、情報レベルのトレースが生成され、すべてのメッセージ ログ アクティビティが停止します。
ログ レベルとその他のオプションについては、「ログ レベルとオプション」セクションで説明します。
switchValue
のsource
属性は、トレースでのみ有効です。 次のようにswitchValue
トレース ソースにSystem.ServiceModel.MessageLogging
属性を指定した場合、効果はありません。
<source name="System.ServiceModel.MessageLogging" switchValue="Verbose">
</source>
トレース ソースを無効にする場合は、代わりに、logMessagesAtServiceLevel
要素のlogMalformedMessages
、logMessagesAtTransportLevel
、およびmessageLogging
属性を使用する必要があります。 これらの属性はすべて false
に設定する必要があります。 これを行うには、前のコード例の構成ファイル、構成エディター UI インターフェイス、または WMI を使用します。 構成エディター ツールの詳細については、「 構成エディター ツール (SvcConfigEditor.exe)」を参照してください。 WMI の詳細については、「 診断に Windows Management Instrumentation を使用する」を参照してください。
ログ レベルとオプション
受信メッセージの場合、ログ記録は、メッセージが形成された直後、メッセージがサービス レベルのユーザー コードに到達する直前、および形式が正しくないメッセージが検出された場合に発生します。
送信メッセージの場合、ログ記録は、メッセージがユーザー コードを離れた直後と、メッセージがネットワークに送信される直前に行われます。
WCF は、サービスとトランスポートの 2 つの異なるレベルでメッセージをログに記録します。 不正な形式のメッセージもログに記録されます。 3 つのカテゴリは互いに独立しており、構成で個別にアクティブ化できます。
logMessagesAtServiceLevel
要素のlogMalformedMessages
、logMessagesAtTransportLevel
、およびmessageLogging
属性を設定することで、ログ レベルを制御できます。
サービス レベル
このレイヤーでは、ユーザー コードに入力 (受信時) される直前、またはユーザー コードから出力 (送信時) される直前のメッセージが記録されます。 フィルターが定義されている場合は、フィルターに一致するメッセージのみがログに記録されます。 それ以外の場合は、サービス レベルのすべてのメッセージがログに記録されます。 インフラストラクチャ メッセージ (トランザクション、ピア チャネル、セキュリティ) も、Reliable Messaging メッセージを除き、このレベルでログに記録されます。 ストリーミング メッセージでは、ヘッダーのみがログに記録されます。 さらに、セキュリティで保護されたメッセージは、このレベルで復号化されてログに記録されます。
トランスポート レベル
このレイヤーでログに記録されたメッセージは、ネットワーク上の輸送に対して、または転送後にエンコードまたはデコードする準備が整います。 フィルターが定義されている場合は、フィルターに一致するメッセージのみがログに記録されます。 それ以外の場合は、トランスポート層のすべてのメッセージがログに記録されます。 すべてのインフラストラクチャ メッセージは、信頼性の高いメッセージング メッセージを含め、このレイヤーでログに記録されます。 ストリーミング メッセージでは、ヘッダーのみがログに記録されます。 さらに、セキュリティで保護されたメッセージは、HTTPS などのセキュリティで保護されたトランスポートが使用される場合を除き、このレベルで暗号化された状態でログに記録されます。
不正レベル
形式が正しくないメッセージは、処理の任意の段階で WCF スタックによって拒否されるメッセージです。 正しくないメッセージは、そのままの状態で記録されます。暗号化されていれば、暗号化されたままで、適切でない XML も、そのままになります。
maxSizeOfMessageToLog
は、CDATA としてログに記録されるメッセージのサイズを定義します。 既定では、 maxSizeOfMessageToLog
は 256K です。 この属性の詳細については、「その他のオプション」セクションを参照してください。
その他のオプション
ログ 記録レベルに加えて、ユーザーは次のオプションを指定できます。
メッセージ全体のログ (
logEntireMessage
属性): この値は、メッセージ全体 (メッセージ ヘッダーと本文) をログに記録するかどうかを指定します。 既定値はfalse
です。つまり、ヘッダーのみがログに記録されます。 この設定は、サービスおよびトランスポート メッセージのログ 記録レベルに影響します。ログに記録する最大メッセージ数 (
maxMessagesToLog
属性): この値は、ログに記録するメッセージの最大数を指定します。 すべてのメッセージ (サービス、トランスポート、および形式が正しくないメッセージ) は、このクォータにカウントされます。 クォータに達すると、トレースが出力され、追加のメッセージはログに記録されません。 既定値は 10000 です。ログに記録するメッセージの最大サイズ (
maxSizeOfMessageToLog
属性): この値は、ログに記録するメッセージの最大サイズをバイト単位で指定します。 サイズ制限を超えるメッセージはログに記録されず、そのメッセージに対して他のアクティビティは実行されません。 この設定は、すべてのトレース レベルに影響します。 ServiceModel トレースがオンの場合、警告レベルのトレースは、ユーザーに通知する最初のログ ポイント (ServiceModelSend* または TransportReceive) に出力されます。 サービス レベルおよびトランスポート レベルのメッセージの既定値は 256K で、形式が正しくないメッセージの既定値は 4K です。注意事項
maxSizeOfMessageToLog
と比較するために計算されるメッセージ サイズは、シリアル化前のメモリ内のメッセージ サイズです。 このサイズは、ログに記録されるメッセージ文字列の実際の長さとは異なる場合があり、多くの場合、実際のサイズよりも大きくなります。 その結果、メッセージがログに記録されない可能性があります。 この事実を考慮するには、maxSizeOfMessageToLog
属性を 10% 予想されるメッセージ サイズより大きく指定します。 さらに、形式が正しくないメッセージがログに記録される場合、メッセージ ログで使用される実際のディスク領域は、maxSizeOfMessageToLog
で指定された値の最大サイズの 5 倍になる可能性があります。
構成ファイルにトレース リスナーが定義されていない場合、指定されたログ レベルに関係なく、ログ出力は生成されません。
このセクションで説明する属性などのメッセージ ログ オプションは、Windows Management Instrumentation (WMI) を使用して実行時に変更できます。 これを行うには、 AppDomainInfo インスタンスにアクセスします。このインスタンスは、 LogMessagesAtServiceLevel
、 LogMessagesAtTransportLevel
、 LogMalformedMessages
のブール型プロパティを公開します。 そのため、メッセージ ログ用にトレース リスナーを構成し、これらのオプションを構成で false
に設定した場合は、後でアプリケーションの実行時に true
に変更できます。 これにより、実行時にメッセージのログ記録が効果的に有効になります。 同様に、構成ファイルでメッセージ ログを有効にした場合は、WMI を使用して実行時に無効にすることができます。 詳細については、「 診断に Windows Management Instrumentation を使用する」を参照してください。
メッセージ ログの source
フィールドは、メッセージがログに記録されるコンテキストを指定します。要求メッセージの送受信時、要求/応答要求または一方向要求の場合、サービス モデルまたはトランスポート層で、または形式が正しくないメッセージの場合です。
形式が正しくないメッセージの場合、 source
は Malformed
と同じです。 それ以外の場合、ソースにはコンテキストに基づいて次の値があります。
要求/応答の場合:
レイヤー | 要求の送信 | 要求の受信 | 返信の送信 | 返信を受信する |
---|---|---|---|---|
サービス モデル レイヤー | サービス レベル 送信 リクエスト |
サービス レベル 受け取る リクエスト |
サービス レベル 送信 返信 |
サービス レベル 受け取る 返信 |
トランスポート層 | トランスポート 送信 |
トランスポート 受け取る |
トランスポート 送信 |
トランスポート 受け取る |
一方向要求の場合:
レイヤー | 要求の送信 | 要求の受信 |
---|---|---|
サービス モデル レイヤー | サービス レベル 送信 データグラム |
サービス レベル 受け取る データグラム |
トランスポート層 | トランスポート 送信 |
トランスポート 受け取る |
メッセージ フィルター
メッセージ フィルターは、messageLogging
構成セクションのdiagnostics
構成要素で定義されます。 これらは、サービス レベルとトランスポート レベルで適用されます。 1 つ以上のフィルターが定義されている場合、少なくとも 1 つのフィルターに一致するメッセージのみがログに記録されます。 フィルターが定義されていない場合は、すべてのメッセージが通過します。
フィルターは完全な XPath 構文をサポートし、構成ファイルに表示される順序で適用されます。 構文的に正しくないフィルターの結果、構成例外が発生します。
フィルターでは、 nodeQuota
属性を使用して安全性機能も提供されます。この属性により、フィルターに一致するように調べることができる XPath DOM 内のノードの最大数が制限されます。
次の例は、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="http://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
属性は、型の修飾アセンブリ名に設定する必要があることに注意してください。