2015-02-25 6 views
1

J'essaie d'utiliser le gestionnaire d'exceptions de journalisation de la bibliothèque d'entreprise, mais de temps en temps lorsque j'actualise la page (évidemment), je obtenir cette erreur:Le bloc d'application de journalisation de bibliothèque d'entreprise - System.InvalidOperationException: Le LogWriter est déjà défini

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 
Exception Details: System.InvalidOperationException: The LogWriter is already set. 

code

protected void Page_Load(object sender, EventArgs e) 
     { 
      Logger.SetLogWriter(new LogWriterFactory().Create()); 
      LogEntry entry = new LogEntry(); 
      entry.Message = "I am logging"; 
      Logger.Write(entry); 

      if (!Page.IsPostBack) 
      { 
      } 
     }   

trace de la pile

[InvalidOperationException: The LogWriter is already set.] 
Microsoft.Practices.EnterpriseLibrary.Logging.Logger.SetLogWriter(LogWriter logWriter, Boolean throwIfSet) +165 
ASPUserManager.Presentation.AspNetUI.GridView.Page_Load(Object sender, EventArgs e) in \AspNetUI\GridView.aspx.cs:20 
System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +51 
System.Web.UI.Control.OnLoad(EventArgs e) +92 
System.Web.UI.Control.LoadRecursive() +54 
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +772 

Je pense peut-être que je devrais vérifier si LogWriter est déjà défini?

Je suis nouveau dans le bloc d'application de journalisation de la bibliothèque d'entreprise et je ne suis pas sûr de savoir comment résoudre ce problème, est-ce que quelqu'un a une idée?

Répondre

4

Vous n'avez besoin de démarrer le bloc qu'une seule fois - une fois que le LogWriter est défini, il est stocké en interne et utilisé pour les appels Write() suivants. Habituellement, vous le feriez au démarrage de l'application (par exemple, dans global.asax Application_Start).

protected void Application_Start() 
{ 
    Logger.SetLogWriter(new LogWriterFactory().Create()); 
} 

Le code ci-dessus charge la configuration et définit le LogWriter. Maintenant, dans votre page, vous pouvez appeler Logger.Write().

Incidently SetLogWriter accepte un booléen indiquant s'il faut lancer si le LogWriter a déjà été défini afin de pouvoir contourner ce comportement de lancement.

Toutefois, dans votre cas, vous ne voulez pas le faire dans Page_Load. Cela pourrait éviter l'erreur que vous voyez mais dans un environnement multithread (comme une application web) vous verrez (probablement) d'autres comportements étranges car SetLogWriter réinitialise la configuration interne et vous pourriez avoir des problèmes avec le verrouillage de fichier ou d'autres problèmes dus à un LogWriter éliminé.

Source: entlib forums

2

Vous devez définir logwritter faux Logger.SetLogWriter (logWriterFactory.Create(), false);

Par défaut, throwIfSet est défini sur true et déclenche une erreur si le programme de journalisation est déjà défini.