共用方式為


設定訊息記錄

本主題描述如何設定不同案例的訊息記錄。

啟用訊息記錄

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 為記錄檔的名稱來完成。 否則,系統會擲回例外。 您也可以實作自定義接聽程式,以將記錄發出至預設檔案。

備註

因為訊息記錄會存取磁碟空間,因此您應該限制特定服務寫入磁碟的訊息數目。 達到訊息限制時,會產生資訊層級的追蹤,並停止所有訊息記錄活動。

記錄層級以及其他選項會在記錄層級和選項一節中討論。

switchValuesource 屬性只適用於追蹤。 如果您指定 switchValue 追蹤來源的屬性 System.ServiceModel.MessageLogging ,如下所示,則不會有任何作用。

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

如果您想要停用追蹤來源,您應該改用 logMessagesAtServiceLevel元素的 logMalformedMessageslogMessagesAtTransportLevelmessageLogging 屬性。 您應該將所有這些屬性設定為 false。 這可以透過使用先前程式代碼範例中的組態檔、透過組態編輯器 UI 介面或使用 WMI 來完成。 如需組態編輯器工具的詳細資訊,請參閱組態編輯器工具 (SvcConfigEditor.exe)。 如需 WMI 的詳細資訊,請參閱 使用 Windows Management Instrumentation for Diagnostics

記錄層級和選項

針對傳入訊息,記錄會在訊息形成之後立即進行,緊接在訊息到達服務等級中的用戶程序代碼之前,以及偵測到格式不正確的訊息時。

針對傳出訊息,記錄會在訊息離開使用者程式碼之後立即進行,且在訊息進入網路之前立即完成。

WCF 會記錄兩個不同層級的訊息:服務和傳輸。 格式不正確的訊息也會記錄。 這三個類別彼此獨立,而且可以在組態中個別啟用。

您可以藉由設定 logMessagesAtServiceLevel 元素的 logMalformedMessageslogMessagesAtTransportLevelmessageLogging 屬性來控制記錄層級。

服務等級

在此層記錄的訊息即將輸入(接收時)或離開(傳送時)用戶代碼。 如果已定義篩選條件,則只會記錄符合篩選條件的訊息。 否則,會記錄服務層級的所有訊息。 基礎結構訊息(交易、對等通道和安全性)也會在此層級記錄,但 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 實體來完成,這會公開這些布林屬性: LogMessagesAtServiceLevelLogMessagesAtTransportLevelLogMalformedMessages。 因此,如果您設定訊息記錄的追蹤接聽程式,但在組態中將這些選項 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 屬性應該設定為型別的限定元件名稱。

另請參閱