views:

429

answers:

4

I'd like to be able to log message information in a database, and I'm trying to decide how best to do that. Is it possible to configure the WCF logging mechanisms to write to a database instead of a file? Thanks.

A: 

You can use Log4Net

CSharpAtl
+2  A: 

You need to have two things:

  • a proper config to enable .NET tracing
  • a trace listener to capture the trace messages and store them in a database

For #1:
You need to turn on tracing in WCF first - you need an entry in <system.serviceModel> that enables tracing:

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

Next, you need to configure .NET tracing as such:

<system.diagnostics>
   <sources>
      <source name="System.ServiceModel" 
              switchValue="Information, ActivityTracing" 
              propagateActivity="true">
         <listeners>
            <add name="xml" />
         </listeners>
      </source>
      <source name="System.ServiceModel.MessageLogging">
         <listeners>
             <add name="xml" />
         </listeners>
      </source>
   </sources>
   <sharedListeners>
       <add name="xml" type="WcfTrace.Trace.WebTraceListener,WcfTrace.Trace" />
   </sharedListeners>
</system.diagnostics>

Here, instead of the WebTraceListener, or other pre-defined listeners, you can also plug in your own database-oriented trace listener.

For #2:
You can - of course - write your own SqlTraceListener - or you can use one of the many ready-made solutions out there, for instance this one here (download the code from Codeplex).

marc_s
A: 

If you don't need the whole SOAP-message, I would suggest to use log4net with custom IParameterInspector or IDispatchMessageInspector implementation, cause in this case you can write to log only what you need. Otherwise, take marc_s's solution.

fspirit