The tracing mechanism in the Windows Communication Foundation is based on the classes that reside in the System.Diagnostic namespace. The important classes are Trace, TraceSource and TraceListener.

The following are the steps to enable tracing in WCF.

1. Configuring WCF to emit tracing information/Define Trace Source, we have the following options:

In the configuration file, we will define a source to enable this configuration as follows:

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

2. For setting the Tracing Level, we have the following available options; we need to set this tracing level to one of the available options other than the default "Off":

In the configuration file, we can choose the above values for the switchValue attribute as follows:

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

3. Configuring a trace listener.

For configuring a trace listener, we will add the following to the config file:

<listeners>
<add name="messages"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData="d:\logs\messages.svclog" />
</listeners>


4. Enabling message logging:

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


logEntireMessage: By default, only the message header is logged but if we set it to true then the entire message, including message header as well as the body, will be logged.

Putting all this together, the configuration file will appear like this.

<system.diagnostics>

<sources>

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

<listeners>

<add name="messagelistener"

type="System.Diagnostics.XmlWriterTraceListener" initializeData="d:\logs\myMessages.svclog"></add>

</listeners>

</source>

</sources>

</system.diagnostics>

<system.serviceModel>

<diagnostics>

<messageLogging logEntireMessage="true"

logMessagesAtServiceLevel="false"

logMessagesAtTransportLevel="false"

logMalformedMessages="true"

maxMessagesToLog="5000"

maxSizeOfMessageToLog="2000">

</messageLogging>

</diagnostics>

</system.serviceModel>

Note: In this case, information will be buffered and not published to the file automatically, So, we can set the autoflush property of the trace under sources as follows:

<trace autoflush ="true" />