本主題描述如何設定不同案例的訊息記錄。
啟用訊息記錄
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 for Diagnostics。
記錄層級和選項
針對傳入訊息,記錄會在訊息形成之後立即進行,緊接在訊息到達服務等級中的用戶程序代碼之前,以及偵測到格式不正確的訊息時。
針對傳出訊息,記錄會在訊息離開使用者程式碼之後立即進行,且在訊息進入網路之前立即完成。
WCF 會記錄兩個不同層級的訊息:服務和傳輸。 格式不正確的訊息也會記錄。 這三個類別彼此獨立,而且可以在組態中個別啟用。
您可以藉由設定 logMessagesAtServiceLevel 元素的 logMalformedMessages、logMessagesAtTransportLevel 和 messageLogging 屬性來控制記錄層級。
服務等級
在此層記錄的訊息即將輸入(接收時)或離開(傳送時)用戶代碼。 如果已定義篩選條件,則只會記錄符合篩選條件的訊息。 否則,會記錄服務層級的所有訊息。 基礎結構訊息(交易、對等通道和安全性)也會在此層級記錄,但 Reliable Messaging 訊息除外。 在串流訊息上,只會記錄標頭。 此外,系統會在此層級解密並記錄安全訊息。
傳輸層級
在此層記錄的訊息已準備好編碼或譯碼,以用於線路上的運輸或傳輸之後。 如果已定義篩選條件,則只會記錄符合篩選條件的訊息。 否則,會記錄傳輸層的所有訊息。 所有基礎結構訊息都會記錄在這個層,包括可靠的傳訊訊息。 在串流訊息上,只會記錄標頭。 此外,安全訊息會記錄為此層級的加密,除非使用 HTTPS 之類的安全傳輸。
格式不正確的層級
格式不正確的訊息是 WCF 堆疊在任何處理階段遭到拒絕的訊息。 格式不正確的訊息會記錄 as-is:如果訊息格式不正確,則會以非適當的 XML 等方式進行加密。
maxSizeOfMessageToLog 定義要記錄為 CDATA 的訊息大小。 根據預設, maxSizeOfMessageToLog 等於 256K。 如需此屬性的詳細資訊,請參閱其他選項一節。
其他選項
除了記錄層級之外,用戶可以指定下列選項:
記錄整個訊息 (
logEntireMessage屬性):這個值會指定是否記錄整個訊息(訊息標頭和本文)。 默認值為false,這表示只會記錄標頭。 此設定會影響服務和傳輸訊息記錄層級。要記錄的訊息上限 (
maxMessagesToLog屬性):此值會指定要記錄的訊息數目上限。 所有訊息(服務、傳輸和格式不正確的訊息)都會計入此配額。 配額達到時,將發出追蹤記錄,並且不會記錄進一步的訊息。 預設值為 10000。要記錄的訊息最大大小(
maxSizeOfMessageToLog屬性):此值會指定以位元組為單位的最大訊息大小。 未記錄超過大小限制的訊息,而且不會針對該訊息執行任何其他活動。 此設定會影響所有追蹤層級。 如果啟用了 ServiceModel 追蹤,則會在第一個記錄點(例如 ServiceModelSend* 或 TransportReceive)發出警告級別的追蹤,以通知使用者。 服務等級和傳輸層級訊息的預設值為 256K,而格式錯誤的訊息的預設值為 4K。謹慎
在計算訊息大小以與
maxSizeOfMessageToLog作比較時,這指的是序列化之前記憶體中的訊息大小。 此大小可能與所記錄之訊息字串的實際長度不同,而且在許多情況下大於實際大小。 因此,可能不會記錄訊息。 您可以藉由將maxSizeOfMessageToLog屬性指定為比預期訊息大小大 10% 來考量這個事實。 此外,如果記錄格式不正確的訊息,訊息記錄所使用的實際磁碟空間最多可是 所maxSizeOfMessageToLog指定值的 5 倍。
如果在組態檔中未定義追蹤接聽程式,則不論指定的記錄層級為何,都不會產生任何記錄輸出。
訊息記錄選項,如本節所述的屬性,可在執行時使用 Windows 管理儀器(WMI)更改。 這可以藉由存取 AppDomainInfo 實體來完成,這會公開這些布林屬性: LogMessagesAtServiceLevel、 LogMessagesAtTransportLevel和 LogMalformedMessages。 因此,如果您設定訊息記錄的追蹤接聽程式,但在組態中將這些選項 false 設定為 ,您稍後可以在應用程式執行時將其變更為 true 。 這有效地讓執行時能記錄訊息。 同樣地,如果你在設定檔啟用訊息記錄,執行時可以用 WMI 來關閉它。 如需詳細資訊,請參閱 使用 Windows Management Instrumentation 進行診斷。
source訊息記錄中的欄位會指定在哪個情境下記錄訊息:傳送/接收要求訊息時、要求-回覆或單向要求、在服務模型層或傳輸層,或在訊息格式不正確的情況下。
若為格式不正確的訊息, source 則等於 Malformed。 否則,source 會根據內容具有下列值。
針對要求/回復:
| 層 | 傳送要求 | 接收要求 | 傳送回復 | 收到回覆 |
|---|---|---|---|---|
| 服務模型層 | 服務 等級 發送 要求 |
服務 等級 收到 要求 |
服務 等級 發送 答 |
服務 等級 收到 答 |
| 傳輸層 | 運輸 發送 |
運輸 收到 |
運輸 發送 |
運輸 收到 |
針對單向請求:
| 層 | 傳送要求 | 接收要求 |
|---|---|---|
| 服務模型層 | 服務 等級 發送 數據報 |
服務 等級 收到 數據報 |
| 傳輸層 | 運輸 發送 |
運輸 收到 |
訊息篩選
訊息篩選器定義於 messageLogging 組態區段的 diagnostics 組態元素中。 它們會套用在服務和傳輸層級。 定義一或多個篩選時,只會記錄至少一個篩選條件相符的訊息。 如果未定義任何篩選,則所有訊息都會通過。
篩選條件支援完整的 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 屬性應該設定為型別的限定元件名稱。