274 votes

Comment utiliser ELMAH manuellement les erreurs dans le journal?

Est-il possible d'effectuer les opérations suivantes à l'aide de ELMAH:

logger.Log(" something");

Je suis en train de faire quelque chose comme ceci:

try 
{
    // Code that might throw an exception 
}
catch(Exception ex)
{
    // I need to log error here...
}

Cette exception ne seront pas enregistrées automatiquement par ELMAH parce qu'il a été manipulé.

426voto

Andrey Kamaev Points 14888

Direct journal de la méthode d'écriture, de travail depuis ELMAH 1.0:

try 
{
    some code 
}
catch(Exception ex)
{
    Elmah.ErrorLog.GetDefault(HttpContext.Current).Log(new Elmah.Error(ex));
}

ELMAH 1.2 apporte plus de souplesse dans l'API:

try 
{
    some code 
}
catch(Exception ex)
{
    Elmah.ErrorSignal.FromCurrentContext().Raise(ex);
}

Il y a une différence entre les deux solutions:

  • Raise méthode s'applique ELMAH des règles de filtrage de l'exception. Log méthode ne fonctionne pas.
  • Raise abonnement est basé sur et est capable de se connecter à une exception près dans le plusieurs enregistreurs.

95voto

Simon_Weaver Points 31141

Je vous recommande d'emballage de l'appel à Elmah dans un simple wrapper classe de votre choix.

using Elmah;

public static class ErrorLog
{
    /// <summary>
    /// Log error to Elmah
    /// </summary>
    public static void LogError(Exception ex, string contextualMessage=null)
    {
        try
        {
            // log error to Elmah
            if (contextualMessage != null) 
            {
                // log exception with contextual information that's visible when 
                // clicking on the error in the Elmah log
                var annotatedException = new Exception(contextualMessage, ex); 
                ErrorSignal.FromCurrentContext().Raise(annotatedException, HttpContext.Current);
            }
            else 
            {
                ErrorSignal.FromCurrentContext().Raise(ex, HttpContext.Current);
            }

            // send errors to ErrorWS (my own legacy service)
            // using (ErrorWSSoapClient client = new ErrorWSSoapClient())
            // {
            //    client.LogErrors(...);
            // }
        }
        catch (Exception)
        {
            // uh oh! just keep going
        }
    }
}

Puis il suffit d'appeler quand vous en avez besoin pour vous connecter une erreur.

try {
   ...
} 
catch (Exception ex) 
{
    // log this and continue
    ErrorLog.LogError(ex, "Error sending email for order " + orderID);
}

Cela présente les avantages suivants:

  • Vous n'avez pas besoin de vous rappeler de cela un peu archaïques de la syntaxe de l'appel Elmah
  • Si vous avez beaucoup de Dll que vous n'avez pas besoin de faire référence à Elmah de Base de chacun - et il suffit de mettre ceci dans votre propre Système de " DLL.
  • Si jamais vous avez besoin de faire une manipulation spéciale ou tout simplement pour mettre un point d'arrêt pour déboguer les erreurs que vous avez tous les un lieu.
  • Si jamais vous éloigner de Elmah, vous pouvez simplement changer un seul endroit.
  • Si vous avez hérité d'enregistrement des erreurs que vous souhaitez conserver (je viens d'arriver à avoir une simple erreur de mécanisme de journalisation qui est liée en quelques UIs que je n'ai pas immédiatement eu le temps de retirer).

Note: j'ai ajouté un " contextualMessage biens à des informations contextuelles. Vous pouvez omettre cette option si vous préférez, mais je trouve cela très utile. Elmah automatiquement déballe des exceptions si le sous-jacent d'exception seront toujours signalés dans le journal, mais le contextualMessage sera visible lorsque vous cliquez sur elle.

30voto

bigtv Points 747

Vous pouvez utiliser le Elmah.ErrorSignal() méthode pour ouvrir une session une question sans lever d'exception.

try 
{
some code 
}
catch(Exception ex)
{
    // log error
    Elmah.ErrorSignal.FromCurrentContext().Raise(ex);
    //continue
}

19voto

Darin Dimitrov Points 528142
catch(Exception ex)
{
    Elmah.ErrorSignal.FromCurrentContext().Raise(ex);
}

14voto

Christophe Geers Points 4595

Oui, c'est possible. En apparence, a été conçu pour intercepter les exceptions non gérées. Cependant, vous pouvez signaler une exception à ELMAH via le ErrorSignal classe. Ces exceptions ne sont pas jetés (ne pas bulle), mais sont uniquement envoyés à ELMAH (et pour les abonnés de l'Augmenter en cas de ErrorSignal classe).

Un petit exemple:

protected void ThrowExceptionAndSignalElmah()
{
    ErrorSignal.FromCurrentContext().Raise(new NotSupportedException());
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X