1

I am upgrading an existing application from 5 to 6. My application is a .NET web application. I rely on Enterprise library to log any errors to the database (sql server).

My application also uses a custom database listener and a custom Logging Exception Handler (both in the form of separate .net projects within my solution).

So, I have 6 installed, and have added the following code to Application_Start-

             IConfigurationSource config = ConfigurationSourceFactory.Create();
        ExceptionPolicyFactory factory = new ExceptionPolicyFactory(config);
        Logger.SetLogWriter(new LogWriterFactory().Create());

        ExceptionManager exceptionManager = factory.CreateManager();

I get a System.NotImplementedException when it hits the Logger.SetLogWriter(new LogWriterFactory().Create()); line of code.

EDIT: More specific error details

 System.NotImplementedException was unhandled by user code
 HResult=-2147467263
 Message=Must be implemented by subclasses.
 Source=Microsoft.Practices.EnterpriseLibrary.Logging

What am I doing wrong?

Here is my web.config-

   <configSections>
<section name="exceptionHandling" type="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Configuration.ExceptionHandlingSettings, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling" requirePermission="true" />
<section name="loggingConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.LoggingSettings, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="true" />
<section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="true" />


 </configSections>
<loggingConfiguration name="" tracingEnabled="true" defaultCategory="General">
<listeners>
  <add name="Database Trace Listener" type="ExtendedPropertyDatabaseListener.ExtendedFormattedDatabaseTraceListener, ExtendedPropertyDatabaseListener" listenerDataType="ExtendedPropertyDatabaseListener.ExtendedFormattedDatabaseTraceListenerData, ExtendedPropertyDatabaseListener" databaseInstanceName="ablmprod" writeLogStoredProcName="Logging.WriteLog" addCategoryStoredProcName="Logging.AddCategory" formatter="Text Formatter" />
  <add name="Event Log Trace Listener" type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.FormattedEventLogTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.FormattedEventLogTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" source="Enterprise Library Logging" formatter="Text Formatter" />
</listeners>
<formatters>
  <add type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" template="Timestamp: {timestamp}{newline}&#xA;Message: {message}{newline}&#xA;Category: {category}{newline}&#xA;Priority: {priority}{newline}&#xA;EventId: {eventid}{newline}&#xA;Severity: {severity}{newline}&#xA;Title:{title}{newline}&#xA;Machine: {localMachine}{newline}&#xA;App Domain: {localAppDomain}{newline}&#xA;ProcessId: {localProcessId}{newline}&#xA;Process Name: {localProcessName}{newline}&#xA;Thread Name: {threadName}{newline}&#xA;Win32 ThreadId:{win32ThreadId}{newline}&#xA;Extended Properties: {dictionary({key} - {value}{newline})}" name="Text Formatter" />
</formatters>
<categorySources>
  <add switchValue="All" name="General">
    <listeners>
      <add name="Database Trace Listener" />
    </listeners>
  </add>
</categorySources>
<specialSources>
  <allEvents switchValue="All" name="All Events" />
  <notProcessed switchValue="All" name="Unprocessed Category" />
  <errors switchValue="All" name="Logging Errors &amp; Warnings">
    <listeners>
      <add name="Event Log Trace Listener" />
    </listeners>
  </errors>
</specialSources>
</loggingConfiguration>
<exceptionHandling>
  <exceptionPolicies>
  <add name="Policy">
    <exceptionTypes>
      <add name="All Exceptions" type="System.Exception, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" postHandlingAction="NotifyRethrow">
        <exceptionHandlers>
          <add name="Logging Exception Handler" type="CustomExceptionLoggingHandler.CustomExceptionLoggingHandler, CustomExceptionLoggingHandler" logCategory="General" eventId="100" severity="Error" title="Enterprise Library Exception Handling" formatterType="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.TextExceptionFormatter, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling" priority="0" />
        </exceptionHandlers>
      </add>
    </exceptionTypes>
  </add>
</exceptionPolicies>
</exceptionHandling>

EDIT: Thanks to @lrb for getting me on the right path. Here is the code that worked-

protected void Application_Start()
{
    LoggingConfiguration loggingConfiguration = BuildLoggingConfig();
    LogWriter logWriter = new LogWriter(loggingConfiguration);
    Logger.SetLogWriter(logWriter, false);
    ExceptionPolicy.SetExceptionManager(exManager);

    // Create the default ExceptionManager object programatically
    exManager = BuildExceptionManagerConfig(logWriter);

    // Create an ExceptionPolicy to illustrate the static HandleException method
    ExceptionPolicy.SetExceptionManager(exManager);

           ...
}

private static LoggingConfiguration BuildLoggingConfig()
{
    // Formatters

    var config = new LoggingConfiguration();

    return config;
}

private static ExceptionManager BuildExceptionManagerConfig(LogWriter logWriter)
{
    var policies = new List<ExceptionPolicyDefinition>();

    var logAndWrap = new List<ExceptionPolicyEntry>
            {

                new ExceptionPolicyEntry(typeof (Exception),
                    PostHandlingAction.ThrowNewException,
                    new IExceptionHandler[]
                     {
                       new WrapHandler("An application error has occurred.",
                         typeof(APIAvailabilityException))
                     })
            };

    policies.Add(new ExceptionPolicyDefinition("Policy", logAndWrap));

    return new ExceptionManager(policies);
}
Ross Bush
  • 14,648
  • 2
  • 32
  • 55
Chris
  • 795
  • 2
  • 12
  • 27

2 Answers2

0

It has changed up a little. You just need a dummy ConfugurationSource. This defaults to everything as it was and works for me. Notice the optional ThrowIfSet parameter for the SetLogWriter method. The documentation states:

throwIfSet : true to throw an exception if the writer is already set; otherwise false. Defaults to true.

IConfigurationSource configurationSource = ConfigurationSourceFactory.Create();
LogWriterFactory logWriterFactory = new LogWriterFactory(configurationSource);                
Logger.SetLogWriter(logWriterFactory.Create(),false);
Logger.Write(le);
Ross Bush
  • 14,648
  • 2
  • 32
  • 55
0

A bit more info for those who still have this issue and the suggested solution doesn't work.

One of the possible reasons for this exception is that CoreBuildTraceListener method is not implemented in your custom TraceListenerData class (if you use one).

In my case I had to add the following to make it work (the code is specific for my implementation):

protected override TraceListener CoreBuildTraceListener(LoggingSettings settings)
{
    return new RollingXmlTraceListener(
        this.FileName,
        this.RollSizeKB,
        this.TimeStampPattern,
        this.RollFileExistsBehavior,
        this.RollInterval,
        this.MaxArchivedFiles);
}
Ondska
  • 133
  • 3
  • 10