2016-05-26 2 views
1

Je suis en train de mettre à niveau une application existante de 5 à 6. Mon application est une application Web .NET. Je compte sur la bibliothèque Enterprise pour enregistrer les erreurs dans la base de données (serveur SQL).Mise à niveau de l'application de Enterprise Library 5 vers 6

Mon application utilise également un écouteur de base de données personnalisé et un gestionnaire d'exception de journalisation personnalisé (tous deux sous la forme de projets .net distincts dans ma solution).

Donc, j'ai 6 installé, et ont ajouté le code suivant à Application_Start-

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

     ExceptionManager exceptionManager = factory.CreateManager(); 

je reçois un System.NotImplementedException quand il frappe le Logger.SetLogWriter (nouveau LogWriterFactory(). Créer()) ; ligne de code.

EDIT: détails d'erreur plus spécifiques

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

Qu'est-ce que je fais mal?

Voici mon 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: Merci à @lrb pour moi d'obtenir sur la bonne voie. Voici le code qui a fonctionné -

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); 
} 

Répondre

0

Il a légèrement changé. Vous avez juste besoin d'une ConfugurationSource factice. Cela vaut par défaut pour tout et fonctionne pour moi. Notez le paramètre optionnel ThrowIfSet pour la méthode SetLogWriter. La documentation indique:

throwIfSet: true pour lancer une exception si le writer est déjà défini; sinon faux. Par défaut à true.

IConfigurationSource configurationSource = ConfigurationSourceFactory.Create(); 
LogWriterFactory logWriterFactory = new LogWriterFactory(configurationSource);     
Logger.SetLogWriter(logWriterFactory.Create(),false); 
Logger.Write(le); 
+1

je reçois toujours la même erreur. – Chris

0

Un peu plus d'informations pour ceux qui ont encore ce problème et la solution proposée ne fonctionne pas.

Une des raisons possibles de cette exception est que la méthode CoreBuildTraceListener n'est pas implémentée dans votre classe personnalisée TraceListenerData (si vous en utilisez une).

Dans mon cas, je devais ajouter ce qui suit pour le faire fonctionner (le code est spécifique pour ma mise en œuvre):

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