Jak używać ELMAH do ręcznego rejestrowania błędów

Czy można wykonać następujące czynności używając ELMAH?

logger.Log(" something");

Robię coś takiego:

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

Ten wyjątek nie będzie automatycznie rejestrowany przez ELMAH, ponieważ został obsłużony.

Author: Peter Mortensen, 2011-09-16

8 answers

Metoda bezpośredniego zapisu logów, działająca od wersji 1.0:

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

ELMAH 1.2 wprowadza bardziej elastyczne API:

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

Istnieje różnica między tymi dwoma rozwiązaniami:

  • Raise metoda stosuje reguły filtrowania ELMAH do wyjątku. Log metoda nie.
  • Raise jest oparty na subskrypcji i jest w stanie zalogować jeden wyjątek do kilku rejestratorów.
 396
Author: Andrey Kamaev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-21 10:52:34

Polecam zawijanie rozmowy do Elmah w prosty sposób.

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

Następnie po prostu zadzwoń, gdy potrzebujesz zarejestrować błąd.

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

Ma to następujące zalety:

  • nie musisz pamiętać tej nieco archaicznej składni wywołania Elmah
  • Jeśli masz wiele bibliotek DLL, nie musisz odwoływać się do Elmah Core z każdego z nich - i po prostu umieść to we własnym' System ' DLL.
  • Jeśli kiedykolwiek będziesz musiał zrobić jakąś specjalną obsługę lub po prostu chcesz umieścić punkt przerwania, aby debugować błędy, masz to wszystko w jednym miejscu.
  • Jeśli kiedykolwiek wyprowadzisz się z Elmah, możesz zmienić jedno miejsce.
  • Jeśli masz starsze rejestrowanie błędów, które chcesz zachować(tak się składa, że mam prosty mechanizm rejestrowania błędów, który jest powiązany z niektórymi interfejsami użytkownika, których nie mam natychmiast czasu na usunięcie).

Uwaga: dodałem właściwość "contextualMessage" dla informacji kontekstowych. Możesz to pominąć, jeśli wolisz, ale uważam, że jest to bardzo przydatne. Elmah automatycznie rozpakowuje wyjątki, więc podstawowy wyjątek będzie nadal raportowany w dzienniku, ale contextualMessage będzie widoczny po kliknięciu na niego.

 88
Author: Simon_Weaver,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-13 03:12:20

Możesz użyć Elmah.Metoda ErrorSignal () do rejestrowania problemu bez podnoszenia wyjątku.

try
{
    // Some code
}
catch(Exception ex)
{
    // Log error
    Elmah.ErrorSignal.FromCurrentContext().Raise(ex);

    // Continue
}
 29
Author: bigtv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-17 07:56:57
catch(Exception ex)
{
    Elmah.ErrorSignal.FromCurrentContext().Raise(ex);
}
 19
Author: Darin Dimitrov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-16 06:48:42

Tak, to możliwe. ELMAH został zaprojektowany do przechwytywania nieobsługiwanych wyjątków. Możesz jednak sygnalizować wyjątek dla ELMAH za pomocą klasy ErrorSignal. Wyjątki te nie są wyrzucane( Nie bubble up), ale są wysyłane tylko do ELMAH (i do subskrybentów zdarzenia Raise klasy ErrorSignal).

Mały przykład:

protected void ThrowExceptionAndSignalElmah()
{
    ErrorSignal.FromCurrentContext().Raise(new NotSupportedException());
}
 14
Author: Christophe Geers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-16 06:55:54

Chciałem zrobić to samo w wątku, w którym zacząłem kolejkować pocztę z mojej aplikacji MVC4, ponieważ nie miałem dostępnego HttpContext, gdy pojawił się wyjątek. Aby to zrobić, na podstawie tego pytania i innej odpowiedzi znalazłem tutaj: elmah: wyjątki bez HttpContext?

W pliku konfiguracyjnym podałem nazwę aplikacji:

<elmah>
    <security allowRemoteAccess="false" />
    <errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="ELMAH" applicationName="myApplication"/>   
</elmah>

Następnie w kodzie (jak odpowiedź podana powyżej, ale bez HttpContext) możesz przekazać null zamiast HttpContext:

ThreadPool.QueueUserWorkItem(t => {
     try {
         ...
         mySmtpClient.Send(message);
     } catch (SomeException e) {
         Elmah.ErrorLog.GetDefault(null).Log(new Elmah.Error(e));
     }
 });
 13
Author: Matthew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:33

Czasami CurrentHttpContext mogą być niedostępne.

Define

public class ElmahLogger : ILogger
{
    public void LogError(Exception ex, string contextualMessage = null, bool withinHttpContext = true)
    {
        try
        {
            var exc = contextualMessage == null 
                      ? ex 
                      : new ContextualElmahException(contextualMessage, ex);
            if (withinHttpContext)
                ErrorSignal.FromCurrentContext().Raise(exc);
            else
                ErrorLog.GetDefault(null).Log(new Error(exc));
        }
        catch { }
    }
}

Użyj

public class MyClass
{
    readonly ILogger _logger;

    public MyClass(ILogger logger)
    {
        _logger = logger;
    }

    public void MethodOne()
    {
        try
        {

        }
        catch (Exception ex)
        {
            _logger.LogError(ex, withinHttpContext: false);
        }
    }
}
 3
Author: tchelidze,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-18 05:45:37

Próbowałem zapisać niestandardowe wiadomości do dzienników elmah za pomocą sygnału.FromCurrentContext().Raise (ex); i okazało się, że te wyjątki są bubbled up, np:

try
{
    ...
}
catch (Exception ex)
{
    Elmah.ErrorSignal.FromCurrentContext().Raise(ex);
    // this will write to the log AND throw the exception
}

Poza tym nie widzę jak elmah obsługuje różne poziomy logowania - czy jest możliwe wyłączenie logowania przez WWW.konfiguracja?

 0
Author: Valery Gavrilov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-06 22:55:16