Ist es möglich, mit ELMAH Folgendes zu tun?
logger.Log(" something");
Ich mache so etwas:
try
{
// Code that might throw an exception
}
catch(Exception ex)
{
// I need to log error here...
}
Diese Ausnahme wird von ELMAH nicht automatisch protokolliert, da sie behandelt wurde.
Antworten:
Direkte Protokollschreibmethode, die seit ELMAH 1.0 funktioniert:
ELMAH 1.2 führt eine flexiblere API ein:
Es gibt einen Unterschied zwischen den beiden Lösungen:
Raise
Die Methode wendet ELMAH-Filterregeln auf die Ausnahme an.Log
Methode nicht.Raise
ist abonnementbasiert und kann eine Ausnahme bei mehreren Loggern protokollieren.quelle
Elmah.ErrorLog.Log()
: Wird ausgelöst, falls der Protokollaufruf selbst fehlschlägt, wodurch möglicherweise die gesamte Web-App heruntergefahren wird.Raise()
scheitert lautlos. Beispiel: Wenn auf der Serverseite ein Problem mit der Fehlkonfiguration auftritt (z. B. Elmah ist so konfiguriert, dass die Fehler auf der Festplatte gespeichert werden, hat jedoch nicht den richtigen Zugriff auf den Protokollordner), wird die.Log()
Methode ausgelöst. (Dies ist jedoch gut zum Debuggen, z. B. warum wird nichts.Raise()
protokolliert?)Ich würde empfehlen, den Anruf an Elmah in eine eigene einfache Wrapper-Klasse zu packen.
Rufen Sie es dann einfach auf, wenn Sie einen Fehler protokollieren müssen.
Dies hat folgende Vorteile:
Hinweis: Ich habe eine 'contextualMessage'-Eigenschaft für Kontextinformationen hinzugefügt. Sie können dies weglassen, wenn Sie es vorziehen, aber ich finde es sehr nützlich. Elmah packt Ausnahmen automatisch aus, sodass die zugrunde liegende Ausnahme weiterhin im Protokoll gemeldet wird, die Kontextnachricht jedoch angezeigt wird, wenn Sie darauf klicken.
quelle
// uh oh! just keep going
. Wenn meine Fehlerbehandlung fehlschlägt, möchte ich wissen. Ich möchte, dass es etwas Lärm macht.Sie können die Elmah.ErrorSignal () -Methode verwenden, um ein Problem zu protokollieren, ohne eine Ausnahme auszulösen.
quelle
quelle
Ja, es ist möglich. ELMAH wurde entwickelt, um unbehandelte Ausnahmen abzufangen. Sie können ELMAH jedoch über die ErrorSignal-Klasse eine Ausnahme signalisieren. Diese Ausnahmen werden nicht ausgelöst (sprudeln nicht), sondern nur an ELMAH (und an Abonnenten des Raise-Ereignisses der ErrorSignal-Klasse) gesendet.
Ein kleines Beispiel:
quelle
Ich wollte dasselbe in einem Thread tun, in dem ich begonnen hatte, E-Mails aus meiner MVC4-Anwendung in die Warteschlange zu stellen. Daher war der HttpContext nicht verfügbar, als eine Ausnahme ausgelöst wurde. Um dies zu tun, habe ich basierend auf dieser Frage und einer anderen Antwort, die hier zu finden ist, Folgendes erhalten: elmah: Ausnahmen ohne HttpContext?
In der Konfigurationsdatei habe ich einen Anwendungsnamen angegeben:
Dann können Sie im Code (wie die oben angegebene Antwort, jedoch ohne den HttpContext) anstelle eines HttpContext null übergeben:
quelle
packages.config
aus? Sehen Sie so etwas wie :<package id="elmah" version="1.2.2" targetFramework="net45" />
<package id="elmah.corelibrary" version="1.2.2" targetFramework="net45" />
<package id="elmah.sqlserver" version="1.2" targetFramework="net45" />'
? Haben Sie mit NuGET installiert?packages.config
Manchmal ist es
CurrentHttpContext
möglicherweise nicht verfügbar.Definieren
Verwenden
quelle
Ich bin auf ASP.NET Core und verwende ElmahCore .
Um Fehler manuell mit HttpContext (im Controller) zu protokollieren, schreiben Sie einfach:
In einem anderen Teil Ihrer Anwendung ohne HttpContext :
quelle
Ich habe versucht, benutzerdefinierte Nachrichten mit Signal.FromCurrentContext () in elmah-Protokolle zu schreiben. Raise (ex); und festgestellt, dass diese Ausnahmen in die Luft gesprudelt sind, z.
Außerdem sehe ich nicht, wie elmah verschiedene Protokollierungsstufen unterstützt - ist es möglich, die ausführliche Protokollierung über eine web.config-Einstellung auszuschalten?
quelle
Benutzte diese Linie und es funktioniert einwandfrei.
quelle